2012-04-10 106 views
2

我打破了我對這個簡單的和平代碼,不想工作,我想不出任何其他解決方案...MYSQL Subselect在哪裏條款

請你幫忙使其工作?

SELECT chart FROM chart WHERE (select count(user_id) FROM users join charts ON 
user_id=charts.UID and charts.chart=chart WHERE INET_NTOA(user_ip)='127.0.0.1')=0; 

有3條表涉及以下的列:

chart(
chart int(5) 
); 

charts(
UID int(11), 
chart int(5) 
); 

`users` (
`user_id` int(11), 
`user_ip` int(10) 
); 

的要點是,從第一「圖表」列選擇應該傳遞給子查詢來charts.chart =圖表,而是子查詢最終會比較自己,即圖表=圖表 - 始終爲真。

我知道它不會像那樣工作......但我真的想不出其他任何方式。對於我正在嘗試做的事情,有什麼辦法嗎?

EDIT 1: 基本上我需要一個反向選擇:

select chart.chart from chart join charts on chart.chart=charts.chart join users 
    on user_id=charts.UID and INET_NTOA(user_ip)='127.0.0.1'; 

此查詢返回由用戶與ip給予標記的圖表,例如:1,4,5-,9. 但我需要選擇那些沒有被標記的,也就是:2,3,6,7,8,10等等......

編輯2: 我正在尋找某種負面聯結。我認爲這樣做,但我很笨,如何使用它。同時做一些研究...

+0

所以......什麼想法?我在這一點上是無能的...... – Anonymous 2012-04-10 12:41:09

回答

1

嘗試:

SELECT c.chart FROM chart c 
LEFT JOIN 
(SELECT cn.chart FROM chart cn 
    JOIN charts cs ON cn.chart = cs.chart 
    JOIN users u ON u.user_id = cs.UID 
    WHERE user_ip = 2130706433) charts_localhost 
ON c.chart = charts_localhost.chart 
WHERE charts_localhost.chart IS NULL 

注意,代替INET_NTOA(user_ip)='127.0.0.1'這是更好的使用

user_ip = 2130706433這是相當於對指數友好。

+0

哇,我永遠不會想到它也不理解_localhost做什麼!但它工作!:)謝謝! 雖然我使用INET_NTOA,但是127.0.0.1應該有'$ _server ['remote_addr']''。 – Anonymous 2012-04-10 12:52:39

+0

這只是子括號中的子查詢的別名。如果它不僅僅是localhost ip,而且對於查詢仍然是常量,則使用'user_ip = INET_ATON($ server ['remote_addr'])'條件。 – piotrm 2012-04-10 12:56:16

+0

oke,看起來更好:) – Anonymous 2012-04-10 16:14:36

1

你試過使用別名?

select a.chart from chart a where (select count(user_id) from users join charts on user_id=charts.UID and charts.chart=a.chart where INET_NTOA(user_ip)='127.0.0.1')=0;

我不知道,如果它在MySQL中,但我認爲它會在MSSQL和Oracle合作。

+0

嗯,我試過別名,但它說未知的列......基本上它在選擇任何東西之前檢查where子句,所以它不能看到它。 – Anonymous 2012-04-10 12:18:12

0

我想這是一個命名問題嘗試這樣做:

SELECT c.chart FROM chart c 
WHERE (
    SELECT COUNT(u.user_id) FROM users u 
    INNER JOIN charts ch 
    ON u.user_id = ch.UID 
    AND ch.chart = c.chart 
    WHERE INET_NTOA(user_ip)='127.0.0.1' 
     ) = 0; 
+0

是的,我也想到了,但它說:錯誤1054(42S22):未知的'c.chart'列在'條款',所以它不會像那樣工作... :( – Anonymous 2012-04-10 12:19:50

0

可以過濾使用,其中SELECT子句:

SELECT TS.*, T.* 
FROM tbl_teams as T 
LEFT JOIN tbl_teamstats TS 
    ON TS.tbl_teams_id = T.id 
WHERE 
TS.id = (
     SELECT TS.id FROM tbl_teamstats TS 
     WHERE TS.tbl_teams_id = T.id 
     ORDER BY TS.id DESC 
     LIMIT 1 
    )