2

我对这种简单的代码和平感到头疼,它不想工作,而且我想不出任何其他解决方案......

你能帮忙让它工作吗?

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=chart,但子查询最终会与自身进行比较,即chart=chart - 总是正确的。

我知道它不会那样工作......但我真的想不出任何其他方式。我想做的事情有什么办法吗?

编辑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:我现在正在寻找某种否定加入。我认为这可以,但我不知道如何使用它。同时做一些研究...

4

4 回答 4

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这是等效的,但也是索引友好的。

于 2012-04-10T12:42:15.993 回答
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。

于 2012-04-10T12:14:35.427 回答
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;
于 2012-04-10T12:15:06.970 回答
0

您可以使用 where 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
    ) 
于 2017-02-26T10:22:22.123 回答