【问题标题】:Is it possible to compare two different row on left out join?是否可以在左连接时比较两个不同的行?
【发布时间】:2012-02-22 09:51:12
【问题描述】:

表 1 -> id,名称
表 2 -> id、name、text_value、table1_id、table3_id
表 3 -> id、name

SELECT * FROM `table1`   
LEFT OUTER JOIN table2 ON table1.id = table2.table1_id   
WHERE 
 (
     (table2.table3_id = '7' AND table2.name like ('%test%'))
 )   
  AND 
 (
      table2.table3_id = '1' and table2.text_value like ('%fast update%'))
 )   
GROUP BY table1.id  
ORDER BY table1.id desc

【问题讨论】:

  • 如果条件之间有相同的布尔运算符 (AND),则可以删除所有括号,因为您不需要更改默认的评估顺序
  • 我可以看到他对@mazzucci 的要求,他想看看 table1 是否包含表 3 中的两个请求记录,因此是奇怪的 AND。他最终得到的是一个不可能的 WHERE

标签: mysql join left-join


【解决方案1】:

是的,但您需要两个连接才能这样做:

  • 因为您将加入到 table2 两次,其中一个联接必须 使用别名。我选择了t2
  • AND 更改为LEFT OUTER JOIN table2 AS t2 ON
  • 在查询的其余部分,将 table2 更改为 t2
  • 当您使用GROUP BY 时,您指定的所有列都需要位于GROUP BY 子句或聚合中。由于您没有这样做,并且不清楚您为什么尝试使用 GROUP BY,因此我将删除 GROUP BY 子句。

还有其他一些变化。请参阅下面的最终查询:

SELECT
  table1.id
FROM
  table1
    LEFT OUTER JOIN
  table2
    ON table1.id = table2.table1_id
    LEFT OUTER JOIN
  table2 t2
    ON table1.id = t2.table1_id
WHERE
  table2.table3_id = '7'
    and
  table2.name like '%test%'
    AND
  t2.table3_id = '1'
    and
  t2.text_value like '%fast update%'
ORDER BY
  table1.id DESC

【讨论】:

    【解决方案2】:

    简短的回答,是的。

    更长的答案,在重新阅读您的问题几次后,以下内容会起作用,但不会是世界上最有效的查询,我强烈建议您重新检查您要完成的工作以及表重组是否会是个好主意。

    我选择了 INNER JOIN,因为您只对符合这两个条件的行感兴趣,因此 NULL 行并不重要。 HAVING 子句确保仅输出与两者都匹配的行,而在 ON 子句中具有 table2 限制有助于限制性能影响。

    SELECT 
        table1.*,
        COUNT(DISTINCT(table3.id)) AS numberOfMatches 
    FROM table1
    
    
    INNER JOIN table2 
    ON table2.table1_id = table1.id
    AND (
        (table2.table3_id = 7 AND table2.name LIKE '%test%') 
        OR 
        (table2.table3_id = 1 AND table2.text_value LIKE '%fast update%')
    )
    
    INNER JOIN table3
    ON table3.id = table2.table3_id
    
    GROUP BY table1.id
    HAVING numberOfMatches = 2
    ORDER BY table1.id DESC
    

    【讨论】:

      【解决方案3】:
      SELECT * 
      FROM `table1` a LEFT OUTER JOIN table2 b ON a.id = b.table1_id   
      WHERE 
       (
           b.table3_id = '7' AND b.name like '%test%'
       )   
        AND 
       (
            b.table3_id = '1' and b.text_value like '%fast update%'
       )   
      GROUP BY a.id  
      ORDER BY a.id desc
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-07-27
        • 1970-01-01
        相关资源
        最近更新 更多