我对这种简单的和平代码感到头疼,它不想工作,而且我想不出任何其他解决方案......
你能帮忙让它工作吗?
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=图表,但子查询最终会与自身进行比较,即图表=图表 - 始终为真。
我知道它不会那样工作......但我真的想不出任何其他方法。我想做的事情有什么办法吗?
编辑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: 我现在正在寻找某种消极的加入。我认为这可以,但我不知道如何使用它。同时进行一些研究...
最佳答案
尝试:
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
这是等效的,但也适合索引。
关于MYSQL 在 where 子句中子选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10088524/