0

当我在这里尝试执行下面的 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

第一张桌子

在此处输入图像描述

第二张桌子 在此处输入图像描述

执行结果

在此处输入图像描述

希望有人可以帮助我解决这个问题!

谢谢

4

3 回答 3

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
于 2013-04-04T18:12:46.833 回答
0

而不是LEFT OUTER JOIN尝试INNER 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

没有看到表模式很难说,所以如果你想把其中的一些放在那里,那会很有帮助。

于 2013-04-04T12:46:24.163 回答
0

您的使用GROUP BY是消除任何带有 null 的行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, '')
于 2013-04-04T13:02:53.957 回答