【问题标题】:MYSQL unselect query from second tableMYSQL 从第二个表中选择查询
【发布时间】:2013-07-16 23:55:40
【问题描述】:

你好,我有这两张桌子

表 1

id    Selection  
-------------------
1     John           
2     Ely               
3     Marcus            
4     Steve           
5     Fritz           
6     Orly           
7     Carlo              
8     Lee    

表 2

id    Selected 
-------------------
1     John                         
3     Marcus 
4     Steve                     
5     Fritz           
7     Carlo 

返回将是未选择的行。这个输出的查询是什么

id    Selection 
-------------------         
2     Ely                         
6     Orly                  
8     Lee

【问题讨论】:

  • 这种模式被称为“反连接”。通常,获得此结果的最有效方法是 LEFT JOIN 操作,然后消除任何匹配的行。你剩下的是不匹配的行。

标签: mysql sql unselect


【解决方案1】:

使用LEFT JOIN 加入表和t2.ID IS NULL 删除公共记录

SELECT t1.* FROM table1 t1 
  LEFT JOIN table2 t2 
    ON t1.ID = t2.ID 
 WHERE t2.ID IS NULL

输出:

╔════╦═══════════╗
║ ID ║ SELECTION ║
╠════╬═══════════╣
║  2 ║ Ely       ║
║  6 ║ Orly      ║
║  8 ║ Lee       ║
╚════╩═══════════╝

this SQLFiddle

【讨论】:

  • +1。这是熟悉的反连接模式。很不错。 @Markie Mark:除了希望它会起作用之外,您还可以尝试了解它是如何工作的,并能够确认它确实有效。
  • 它有效.. 我的错我切换表连接.. 感谢您的帮助
  • @MarkieMark - 很高兴!有关联接如何工作的更多详细信息,请参阅:A Visual Explanation of SQL Joins
【解决方案2】:

您可以使用Left Join

 Select t1.id,t2.selection from 
 table1 t1 left join table2 t2 
 ON t1.ID = t2.ID 
 where t2.id is null;

【讨论】:

  • 您刚刚更改了整个答案,现在它是我的确切答案! :P
  • @hims056 因为我意识到这是 MySQL 而不是 Oracle。
  • 真的很奇怪.. 我完全用我的数据库做你的答案.. 但我不能得到相同的结果
【解决方案3】:

使用此查询。它对你有用。

select table1.* from table1 where table1.id not in (select id from table2)

【讨论】:

  • 我记得在小型数据库上使用过它。它可以工作,但是如果你有更大的表,这个查询会给你带来缓慢的结果和不需要的结果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-13
  • 1970-01-01
相关资源
最近更新 更多