【问题标题】:how to write this self join query in mysql如何在 mysql 中编写这个自连接查询
【发布时间】:2012-02-03 08:43:24
【问题描述】:

你好,我有一个这样的表结构

products_id | model_num | master_model_num
   1        |  cth001   |    0 
   2        |  cth002   |    0
   3        |  cth003   |    cth001
   4        |  cth004   |    cth001
   5        |  cth005   |    0
   6        |  cth006   |    cth002

我的问题

我会将products_id 提供给表格,它将获得master_model_num 等于给定products_idmodel_num 的所有产品ID

我尝试了以下查询,但它没有生成我想要的结果

SELECT p.products_id 
FROM products p,products pp 
WHERE p.products_id=pp.products_id 
AND p.products_model=pp.products_master_model 
AND p.products_id='1' 

【问题讨论】:

  • 对于给定的示例,由于您对两个表都有 products_id 的等连接,并且 products_id 在您的 WHERE 子句末尾被过滤为 1,您将只收到该单条记录。

标签: mysql join inner-join self-join


【解决方案1】:
SELECT pp.products_id
    FROM products p
        INNER JOIN products pp
            ON p.model_num = pp.master_model_num
    WHERE p.products_id = '1'

【讨论】:

  • 永远不要在 MySQL 中使用显式连接语法,至少如果您使用的是 5.1 或更低版本,它会阻止查询优化器为您的查询生成正确的计划(是的,我已经对此进行了广泛的测试)。
  • @PlexQ:你能提供一些关于这个测试的证据(博客文章、错误报告等)吗?我从来没有听说过这样的事情。
  • @Joe Steffanelli 这正是我所需要的。为此 +1
【解决方案2】:

不会

SELECT products_id
FROM products
WHERE master_model_num = (SELECT model_num 
                          FROM products 
                          WHERE products_id = 1)

在这种情况下更有意义?通过在查询末尾添加AND p.products_id='1',您可以保证您只会获得一条记录。

【讨论】:

  • 没有内部查询的解决方案。我可以用内部查询来做到这一点
【解决方案3】:

试试这个

SELECT 
  p.products_id 
 FROM 
   products p 
 INNER JOIN 
   products pp 
 ON 
   pp.products_master_model = p.products_model

【讨论】:

    【解决方案4】:
    SELECT p.products_id FROM products p,products pp where p.model_num=pp.master_model_num and p.products_id='1' 
    

    【讨论】:

      猜你喜欢
      • 2014-07-27
      • 1970-01-01
      • 2011-09-13
      • 2015-10-19
      • 2019-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多