【问题标题】:left outer join on the same table with condition有条件的同一张表上的左外连接
【发布时间】:2018-04-30 10:40:53
【问题描述】:

我在 mysql 5.7 DB 中有一个名为“mytable”的表,其制作方式如下:

 --------------------
| title   |   flag   |
|--------------------|
| first   |   0      |
| first   |   1      |
| second  |   0      |
 --------------------

从这个表中,我只需要选择标志 = 0 的行,并从这些行中删除所有具有相同标题的标志 = 1 的行。最终得到如下结果:

 --------------------
| title   |   flag   |
|--------------------|
| second  |   0      |
 --------------------

如何编写查询?谢谢。

【问题讨论】:

  • 请不要指望为您编写代码。
  • 在我看来这是一个合法的问题,我不确定是否使用“IN”运算符、“HAVING COUNT()”或“LEFT OUTER JOIN”,所以我要求查看解决方案。如果你不想回答,你不必回答......
  • 这是一个常见问题解答。与每个问题一样,请在 Google 上搜索您的问题/问题/目标/desiderata 的许多清晰、简洁、特定版本/变体/措辞,带和不带您的特定字符串/名称/代码,并从许多问题中阅读许多答案,这应该会进一步通知您谷歌搜索。如果在应用所学知识并重复此操作后找不到答案,请提出问题。使用最常见的高效关键字作为标签。使用最佳搜索作为标题。

标签: mysql join outer-join


【解决方案1】:

只需使用子查询并将其与 MySQL 的 IN() 函数结合使用。以下将起作用:

SELECT title, 
       flag
 FROM mytable
WHERE flag = 0
  AND title NOT IN( SELECT title FROM mytable WHERE flag = 1 );

SQL Fiddle

【讨论】:

  • 赞成,谢谢。不幸的是没有出现,因为我的代表太低了。我在猜测,如果使用类似“count = 1”的不同解决方案在执行时间上可能比使用“NOT IN”更快。
【解决方案2】:

进行左外连接

SELECT a.*
FROM mytable a
LEFT OUTER JOIN mytable b
ON a.title = b.title
AND b.flag = 1
WHERE a.flag = 0
AND b.flag IS NULL

执行 LEFT OUTER JOIN,然后检查其中一个连接列中的 NULL 以确保没有找到匹配的记录。

【讨论】: