【问题标题】:MySQL DISTINCT on one column and LEFT JOIN一列上的 MySQL DISTINCT 和 LEFT JOIN
【发布时间】:2018-05-26 15:17:54
【问题描述】:

我有一个带有左连接的 SQL 查询:

SELECT i.id
     , i.user_id
     , i.date
     , h.cat_id
  FROM io__image i
  LEFT 
  JOIN io__image_cat_hext h
    ON h.image_id = i.id
 WHERE i.home_granted >= 1 
   AND user_id = 40
 ORDER 
    BY i.date DESC

结果如下:

id   user_id          date       cat_id     
530     40  2018-05-12 20:45:54     42
528     40  2018-05-11 22:59:17     42
518     40  2018-05-11 17:22:30     42
508     40  2018-05-09 13:45:40     37
504     40  2018-05-06 22:40:31     37
492     40  2018-05-02 21:21:20     37
490     40  2018-05-02 16:16:09     36
481     40  2018-05-02 15:08:35     36

是否有可能获得 DISTINCT cat_id?我尝试使用 Group by:

SELECT i.id
     , i.user_id
     , i.date
     , h.cat_id
  FROM io__image i 
 GROUP 
    BY h.cat_id
  LEFT 
  JOIN io__image_cat_hext h
    ON h.image_id = i.id
WHERE i.home_granted >= 1 
   AND user_id = 40
 ORDER 
    BY i.date DESC

但我收到此错误:

'LEFT JOIN io__image_cat_hext ON io__image_cat_hext.image_id = io__image.id 附近的语法 WHER' 在第 4 行

【问题讨论】:

  • 如果你想要不同的 cat_id 那么你想要代表什么 id 值。例如对于 cat_id 42 ,你想要什么 id 530 或 528。附加所需的输出将有助于理解你的问题
  • 按 cat_id 分组?
  • 如果您想要cat_id 的最新行 - 这是您的答案:stackoverflow.com/questions/7745609/…
  • 编辑您的问题并提供您想要的结果。非常不清楚。

标签: mysql sql left-join distinct


【解决方案1】:

在这种情况下,很难理解DISTINCT cat_id 的确切含义。也许您正在寻找类似的东西?

SELECT io__image.id,
       io__image.user_id,
       io__image.date,
       io__image_cat_hext.cat_id
       FROM (SELECT max(io__image_cat_hext.image_id) image_id,
                    io__image_cat_hext.cat_id
                    FROM io__image_cat_hext
                    GROUP BY io__image_cat_hext.cat_id) io__image_cat_hext
            INNER JOIN io__image
                       ON io__image.id = io__image_cat_hext.image_id
       ORDER BY io__image.date DESC;

它只会为您提供每个类别中具有最高 id 的图像。如果 ids 是自动递增的,那就是最近插入的图像。

【讨论】:

  • 是的,抱歉,我想添加来自不同类别的最后一张图片。我的查询中有一个 SQL 错误:第 6 行靠近 'io__image_cat_hext.cat_id FROM io__image_cat_hext' 的语法错误
  • @LondonSmith:我漏掉了一个逗号。这就是为什么您应该在问题中包含表格的 DDL。那时我可以测试它。无论如何,请参阅我的编辑。我还将min 更改为max,因为我知道这就是您所说的“最后添加”的意思。
  • 这真的很完美,谢谢百万。我不知道如何包含 DDL,我不知道。
  • @LondonSmith:欢迎。我所说的 DDL 尤其是 CREATE TABLE ... 语句。如果您自己创建了数据库,您应该拥有它们。否则,请参阅 SQL 客户端的文档,了解如何从现有表中生成它们。例如。在 MySQL Workbench 中,您可以右键单击左侧树中的表,然后选择“复制到剪贴板”>“创建语句”,将 CREATE ... 复制到剪贴板中。
【解决方案2】:

如果您只想要 cat_id 值,那么您可以这样做:

select h.cat_id
from io__image i join
     io__image_cat_hext h
     on h.image_id = i.id
where i.home_granted >= 1 and i.user_id = 40
group by h.cat_id
order by max(i.date) desc;

没有显示您想要的结果,这似乎最适合您的问题。

【讨论】:

  • 但没有给我按 io__image.date desc 订购的最后一个。 @stick bit 查询给出了最后一个。
猜你喜欢
  • 2016-12-14
  • 2012-02-28
  • 2017-10-26
  • 1970-01-01
  • 1970-01-01
  • 2013-08-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多