Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/267.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何在sql中选择可能的行_Php_Mysql_Sql_Row_Solution - Fatal编程技术网

Php 如何在sql中选择可能的行

Php 如何在sql中选择可能的行,php,mysql,sql,row,solution,Php,Mysql,Sql,Row,Solution,好吧,这就是我的情况: 我有两张桌子:照片,画廊。 我只想用每个图库中的一张照片来显示所有图库,但我在PhotoTable列中有标题\u photo。 我想展示那张图片,它的标题是“照片=”y“,当然,其他画廊的一些图片没有标题,它们的标题是“照片=”n“。我有这个sql SELECT * FROM photos RIGHT JOIN gallery ON gallery.code = photos.gallery_code WHERE photos.title_photo = 'y' GRO

好吧,这就是我的情况: 我有两张桌子:照片,画廊。 我只想用每个图库中的一张照片来显示所有图库,但我在PhotoTable列中有标题\u photo。 我想展示那张图片,它的标题是“照片=”y“,当然,其他画廊的一些图片没有标题,它们的标题是“照片=”n“。我有这个sql

SELECT * FROM photos
RIGHT JOIN gallery
ON gallery.code = photos.gallery_code
WHERE photos.title_photo = 'y' 
GROUP BY gallery.id
我有4个图库,我只在一个图库中设置了行照片表标题_photo='y'。该sql仅显示 一个图库,在PhotoTable中设置了标题_photo='y'

我的问题是:


是否有任何解决方案可以显示其他画廊他们有照片。title\u photo='n'和show gallery哪个有title\u photo='y'?

似乎您需要每个画廊中的第一张照片,其中第一张照片由title\u 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。接下来我们需要把它转换成一个可用的照片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) 
看到我们在这里干什么了吗?我们正在使用一个查询来使用指定的逻辑生成gallery/first photo关系

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

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


专业提示:除非你是真正的专家,否则不要使用非标准的MySQL扩展来分组

尝试在“y”中的WHERE photos.title\u photo,“n”GROUP BY gallery.id,photos.title\u photo不起作用,它只显示带有“n”的行。好的,现在它显示带有“y”的列,但它显示照片表中具有相同库代码的两行GROUP BY的目的是什么?您正在使用有害的MySQL扩展来分组。请阅读本文并相应修改您的查询。转到sqlfiddle.com并加载示例数据。您的代码有很多潜在的问题:groupby gallery.id与SELECT*组合,groupby不具有聚合函数,右连接与WHERE photos.title_photo='y'组合是三个我可以立即看到的仍然相同,它显示了另一张标题为“n”而不是“y”的照片。也许您可以通过检查我的第一个子查询的结果来排除故障。我显然没有你的数据,所以我无法排除故障。