【问题标题】:LEFT OUTER JOIN keep all matched results from first table use where just for second tableLEFT OUTER JOIN 保留第一个表的所有匹配结果,仅用于第二个表
【发布时间】:2013-03-26 13:03:17
【问题描述】:

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

我想做什么:

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

    通过表 1 中记录的盐,以及来自父站点的盐 ($parent_salt)

  3. SUM投票并在记录结果中返回(如果在第二个表中没有找到结果返回0)

ID 119 和 250 在第二个表中有投票结果,其他没有。问题 我得到的是,当我执行查询时,它只返回记录 1,119 和 250,其他 id 存在但没有返回?

查询:

// 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

第一张桌子

第二张桌子

执行结果

希望有人能帮我解决这个问题!

谢谢

【问题讨论】:

    标签: mysql select join where


    【解决方案1】:

    试试INNER JOIN,而不是LEFT OUTER JOIN。另外,不要在IN 子句中使用'。最后,我把你JOIN的顺序改了,只是因为我很挑剔:)

    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
      INNER JOIN websites_thumbs AS t 
      ON w.salt = t.similar_website_salt AND t.website_salt = 'VxZQ85cByb98wUx0f3' 
    WHERE w.id IN (1, 20, 31, 4, 199, 250, 633953)
    GROUP BY t.similar_website_salt
    

    如果没有看到表架构,这很难说,所以如果你想把其中的一些放在上面,那会很有帮助。

    【讨论】:

      【解决方案2】:

      您对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, '')
      

      【讨论】:

      • 已完全尝试,但具有空相似网站盐值的行仍会从结果集中消除。奇怪的是,返回的第一条id为1的记录,在第二张表中没有记录(所以这一条没有被淘汰?)
      • @Freshtea - 我的更改有点持续。您是否碰巧看到添加了两条 COALESCE 行?
      • @Freshtea - 另外,您的屏幕截图仅在第一个表中显示 1 条记录。你能改变你的快照来显示另一个被淘汰的行吗?
      • 是的,我都看到了,我添加了一个带有执行结果的快照。在第一个表(主表)中,我有几百万条记录。
      • @Freshtea - 你真的想加入t.similar_website_salt = w.salt吗?查看您的最新快照,您似乎应该使用t.website_salt = w.salt。不过,我可能是错的。除此之外,我想不出可能是什么问题。
      【解决方案3】:

      并非所有记录在第二个表中都有子记录,所以我们不能 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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-11-18
        • 2013-05-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-04-11
        • 2012-06-21
        相关资源
        最近更新 更多