LEFT OUTER JOIN保留第一个表的所有匹配结果,仅用于第二个表

时间:2013-04-04 12:40:49

标签: mysql select join where

当我尝试执行下面的mysql查询时,我不会在WHERE子句中返回所有记录ID的给出。

我想做什么:

  1. 按ID(IN)
  2. 获取所有结果记录
  3. 加入第二个表(websites_thumbs)通过表1的website_salt记录结果

    来自表1的记录的盐,但也来自父站点的盐($ parent_salt)

  4. SUM投票并在记录结果中返回(如果找不到第二个表中的结果返回0)

  5. ID 119和250在第二个表中有投票结果,其他没有。问题 我得到的是,当我执行查询时,它只返回记录1,119& 250其他身份是否存在,但他们不会被退回?

    查询:

    // VxZQ85cByb98wUx0f3 =>父盐来自另一个查询(页面数据查询)

    SELECT 
        SUM(CASE t.thumb when 1 then 1 else 0 end) as thumbs_up,
        SUM(CASE t.thumb when -1 then 1 else 0 end) as thumbs_down,
        w.*, t.*
    FROM websites as w
      LEFT OUTER JOIN websites_thumbs AS t 
      ON t.similar_website_salt = w.salt AND t.website_salt = 'VxZQ85cByb98wUx0f3' 
    WHERE w.id IN ('1', '20', '31', '4', '199', '250', '633953')
    GROUP BY t.similar_website_salt
    

    第一张表

    enter image description here

    第二张表 enter image description here

    执行结果

    enter image description here

    希望有人可以帮助我!

    由于

3 个答案:

答案 0 :(得分:0)

而不是LEFT OUTER JOIN尝试INNER JOIN。另外,请勿在{{1​​}}子句中使用'。最后,我改变了你IN的顺序,因为我很挑剔:)

JOIN

如果没有看到表格架构,这很难说,所以如果你想在那里抛出一些它会有所帮助。

答案 1 :(得分:0)

您对GROUP BY的使用正在消除任何行为similar_website_salt的行。您需要将null值更改为其他值(例如空字符串),然后将其分组。请注意,添加COALESCE的行有两行:

SELECT 
    SUM(CASE t.thumb when 1 then 1 else 0 end) as thumbs_up,
    SUM(CASE t.thumb when -1 then 1 else 0 end) as thumbs_down,
    w.*, t.*,

    COALESCE(t.similar_website_salt, '')

FROM websites as w
  LEFT OUTER JOIN websites_thumbs AS t 
  ON t.similar_website_salt = w.salt AND t.website_salt = 'VxZQ85cByb98wUx0f3' 
WHERE w.id IN ('1', '20', '31', '4', '199', '250', '633953')

GROUP BY COALESCE(t.similar_website_salt, '')

答案 2 :(得分:0)

并非所有记录都在第二个表中都有子记录,所以我们不能 GROUP BY t.similar_website_salt并保留结果集中的记录 这个值。

SELECT 
    SUM(CASE t.thumb when 1 then 1 else 0 end) as thumbs_up,
    SUM(CASE t.thumb when -1 then 1 else 0 end) as thumbs_down,
    w.*, t.*
FROM websites as w
  LEFT OUTER JOIN websites_thumbs AS t 
  ON t.similar_website_salt = w.salt AND t.website_salt = 'VxZQ85cByb98wUx0f3' 
WHERE w.id IN ('1', '20', '31', '4', '199', '250', '633953')
//GROUP BY t.similar_website_salt
GROUP BY w.id <-- this does the trick