我在这个简单的代码安静上打破了我的头脑,不想工作,我无法想到任何其他解决方案...
你能帮忙让它发挥作用吗?
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: 我现在正在寻找某种负面联接。我认为这样做,但我对如何使用它毫无头绪。同时做一些研究......
答案 0 :(得分: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。
答案 1 :(得分: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
这是等同的,但也是索引友好的。
答案 2 :(得分: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;
答案 3 :(得分: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
)