2012-04-10 108 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 
    )