如何在sql中选择可能的行

问题描述 投票:0回答:1

好吧,这就是我的情况:
我有 2 张桌子:照片画廊。 我只想显示所有画廊,每个画廊中都有一张照片,但我在 photos(TABLE) 列 title_photo 中。
我想显示该图像,其中有 title_photo='y' 当然其他画廊的一些图像没有它(它们有 title_photo = 'n')。我有这个sql

SELECT * FROM photos
RIGHT JOIN gallery
ON gallery.code = photos.gallery_code
WHERE photos.title_photo = 'y' 
GROUP BY gallery.id

我有 4 个画廊,只有一个画廊位于第

(photos TABLE) title_photo = 'y'
行。该sql仅显示 一个画廊,其中有
photos(TABLE) set title_photo = 'y'

我的问题是:

有什么解决方案可以显示其他画廊(他们有

photos.title_photo = 'n'
)并显示有
title_photo = 'y'
的画廊吗?

php sql mysql row
1个回答
0
投票

您似乎想要每个画廊中的“第一张”照片,其中“第一张”由 title_photo 中的值“y”定义(如果存在)。如果图库没有标题照片,我们将使用该图库中 photo.id 最小的照片作为“第一张”。

对于初学者来说,我们需要找到每个图库中“第一张”照片的伪 ID。让我们试试这个:

   SELECT photos.gallery_code,
          MIN(photos.id + (100000000 * photos.title_photo <> 'y')) AS pseudoid
     FROM photos
 GROUP BY photos.gallery_code

这为我们提供了每个画廊的一个真实的 photos.id,或者一个大一亿的 photos.id。接下来我们需要将其转回可用的照片 ID,就像这样。

   SELECT gallery_code, (pseudoid MOD 100000000) AS id
     FROM (
        SELECT photos.gallery_code,
               MIN(photos.id + (100000000 * photos.title_photo <> 'y')) AS pseudoid
          FROM photos
      GROUP BY photos.gallery_code 
     ) AS firsts

接下来,我们需要将第一张照片列表加入到照片和图库表中。

 SELECT p.whatever, g.whatever
   FROM (
       SELECT gallery_code, (pseudoid MOD 100000000) AS id
         FROM (
            SELECT photos.gallery_code,
                   MIN(photos.id + (100000000 * photos.title_photo <> 'y')) AS pseudoid
              FROM photos
          GROUP BY photos.gallery_code 
         ) AS firsts
        ) AS f
   JOIN gallery AS g ON f.gallery_code = g.code
   JOIN photos AS p  ON f.id = p.id
  ORDER BY (whatever you need here) 

看到我们在这里做什么了吗?我们使用查询来使用指定的逻辑生成图库/第一张照片关系。

然后我们将其用作子查询(虚拟表)。我们将其连接到两个数据表以检索我们需要的信息,仅用于第一张照片。

专业提示:不要在应用软件中使用 SELECT *。具体说明结果集中所需的列。

专业提示:除非您真的是专家,否则不要使用非标准 MySQL 扩展

GROUP BY
http://dev.mysql.com/doc/refman/5.5/en/group-by-extensions.html

© www.soinside.com 2019 - 2024. All rights reserved.