繁体   English   中英

如何在SQL中选择可能的行

[英]How to select possible row in sql

好吧,这是我的情况:
我有2张桌子: 照片画廊 我只想显示每个画廊中所有画廊的一张照片,但是我在“ 照片” (表格)列中的“ 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'画廊?

看来您想要每个图库中的“第一张”照片,其中“第一张”由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或一个太大的一亿个。 接下来,我们需要像这样将其转换为可用的照片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

接下来,我们需要将第一张照片的列表加入到photos and gallery表中。

 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 *。 具体说明结果集中所需的列。

专家提示:除非您真的很熟练,否则不要对GROUP BY使用非标准的MySQL扩展。 http://dev.mysql.com/doc/refman/5.5/en/group-by-extensions.html

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM