MYSQL 在 where 子句中子选择

标签 mysql database subquery

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

你能帮忙让它工作吗?

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/

相关文章:

php - MYSQL/PHP 选择

java - 从 Java 中检索 MYSQL 数据库结构信息

MySQL 错误 1215 : Cannot add foreign key constraint for geometry datatype POINT

java - WSDL Web 服务从数据库返回旧数据,即使我已经更新了数据库

mysql - 为给定字符串搜索数据库的好算法

mysql - SQL获取多个结果

php - 你如何使用mysql join来过滤掉整行?

Mysql:从连接表中获取最后一行

MySQL 错误 1093 - 无法在 FROM 子句中指定要更新的目标表

mysql - 如何使用外表编写子查询