【问题标题】:select ... where (a=1 or b=min(b)) GROUP BY xyselect ... where (a=1 or b=min(b)) GROUP BY xy
【发布时间】:2013-01-14 17:51:31
【问题描述】:

我有一张表 gall_photos,其中包含许多画廊的照片

  • id (int)
  • gall_id (int)
  • 文件名(varchar)
  • 位置(整数)
  • 预览(tinyint 1)
  • date_add(日期时间)

现在我想获取照片列表(用于摘要预览),每个 gall_id 一张,但如果有预览 1,那么这个,否则是位置​​编号最低的照片。最后按date_add排序

select * 
from gall_photos 
where (preview = 1 or position = min(position)) 
group by gall_id 
order by date_add

此查询返回错误(如果使用“或 position = min(position)”)

请问有什么办法吗?

编辑(12.1. 18:50UTC):可以在一个画廊(gall_id)中查看更多照片的预览,然后我需要其中一张,再次是最低位置

【问题讨论】:

  • 去掉 where 语句周围多余的括号
  • WHERE CLAUSE 不允许使用 GROUP BY 代替,请参阅下面的答案。谢谢
  • 哦,我完全忘记了,谢谢大家的回答

标签: mysql


【解决方案1】:

你可以这样做

select * 
from gall_photos x 
where (preview = 1 or (position = 
                             (SELECT min(x2.position)
                              FROM gall_photos x2 
                              WHERE x.gall_id = x2.gall_id
                              Group By x2.gall_id)
                      and not exists 
                              (select 1 
                               from gall_photos x2 
                               where x2.gall_id=x.gall_id 
                               and x2.preview=1)
                        )
       );

SQL FIDDLE DEMO

【讨论】:

  • 有趣的想法,谢谢。我要投票给新总统,那我试试……
  • 这不会同时返回!?!?!
  • 是的,这可以正常工作。但是现在我发现了另外一种情况......我在上面的编辑..如果我检查了不止一个预览,那么我得到所有这些:-(
  • 好的,我通过在查询末尾添加 GROUP BY gall_id 解决了这个问题
【解决方案2】:

rs 的解决方案非常接近,但是如果您有一条 preview=1 的记录,并且它没有 gall_id 的最低位置,他会给您 preview=1 和最低位置。所以我认为你想要的是:

select * 
from gall_photos g1
where preview = 1
  or not exists (select * from gall_photos g2 where g2.gall_id=g1.gall_id and g2.preview=1)
  and position = (select min(g3.position) from gall_photos g3
    where g3.gall_id=g1.gall_id)
order by date_add

【讨论】:

  • 是的,我认为 rs 在我发帖后改变了他的回答。注意 DnD 的评论不再适用于该答案的当前状态。任何。就我个人而言,我认为我的有点不那么神秘,但不管对你有用。 :-)
【解决方案3】:

这样的事情怎么样...

SELECT a.gall_id
     , COALESCE(c.position,a.position) position
  FROM gall_photos a
  JOIN 
     ( SELECT gall_id,MIN(position) min_position FROM gall_photos GROUP BY gall_id) b 
    ON b.gall_id = a.gall_id 
   AND b.min_position = a.position
  LEFT
  JOIN gall_photos c
    ON c.gall_id = a.gall_id
   AND c.preview = 1;

【讨论】:

  • 不幸的是,此查询仅返回第一个放置的图像(最低位置),但如果我检查了预览,则返回该位置(但 id、文件名仍然是第一行)。如果我检查了更多预览,我会得到更多具有相同(第一位置)行的行,但预览的位置:-)
  • 你能用一些示例数据来说明这个问题吗
【解决方案4】:

WHERE CLAUSE 不允许与GROUP BY 一起使用

使用HAVING

select * 
from gall_photos 
group by gall_id 
having (preview = 1 or position = min(position)) 
order by date_add

【讨论】:

  • 好的,谢谢,“拥有”对我来说是新的。查询现在可以正常工作,但仍然无法正常工作。这个返回每个画廊的第一个(由 GROUP BY 修剪)
【解决方案5】:
select id, gall_id, filename, position, preview, date_add
from gall_photos 
where position in (select min(position)from gall_photos) 
or
exists (select preview from gall_photos where preview = 1)
group by gall_id
order by date_add;

【讨论】:

  • 这不是检查组内的位置,而是检查所有gal_id的位置。
  • 这将返回每个画廊的第一个位置,如果选中预览 (=1),则每个预览的所有行也=1。
  • 我已经更新了我的答案,如果你还没有解决你的问题,你可以检查一下是否可以
猜你喜欢
  • 2011-12-24
  • 1970-01-01
  • 2021-09-21
  • 2021-11-28
  • 2015-11-29
  • 2017-01-11
  • 2014-04-04
  • 2018-01-29
  • 1970-01-01
相关资源
最近更新 更多