-1

对于熟悉 SQL 的人来说,这似乎是一个简单的问题,但对我来说却不是。

无论如何,这是一个示例表:
样品表

主键(也是唯一键)在id上。所以基本上这个场景是休闲的。用户可以添加图像。新添加的图像以comune_number0插入,避免重复(文件名 =图像通过 PHP)。插入的图像可以分配给另一个表中的类别。相同的图像可以分配给许多类别,每个类别都插入一个具有类别 ID (comune_number) 的新行。两个表之间的关系在comune_number上。

我想显示图像,并选中已分配的复选框。
我的问题很简单。如何一次包含所有图像,但在已分配相同图像的情况下,包含该 comune_number 而不是 0。我不在乎顺序。我想要达到的结果是这样的:
样本结果

我知道GROUP BY,所以如果我尝试

mysql_query("SELECT * FROM banner WHERE `comune_number` = 0");  

或者

mysql_query("SELECT * FROM banner GROUP BY `image`");  

我最终得到了相同的(不想要的)结果。

很可能我必须将两个查询合二为一,但我不知道是哪个以及如何。

注意 1:我在 phpMyAdmin 中尝试了许多组合,基于我的(少量)知识和我在 Google 中发现的内容(包括 Stackoverflow),但没有一个结果如图所示。

注2:MySQL 5.1 版

欢迎仅使用 MYSQL 或与 PHP 解决方案结合使用。

编辑

我需要保留 comune_number。因此,当我显示图像时,我需要知道 id。
我的查询必须依赖 comune_number,所以当我需要 comune_number = 10 时,结果应该如上图第二张所示。

编辑2

看来我没有说清楚。所以我想要的是,当用户观看 id 10 的类别时,向他展示所有图像一次,并标记分配给该类别的图像。
另一个例子是here。因此,如果用户正在观看 id=9 的类别(comune_number),则将每张图片显示一次,并标记分配给它的两个。

在此处输入图像描述

4

4 回答 4

2

根据您的 SQLFiddle 和这里​​的所有评论是更新的查询:

   SELECT r.* 
     FROM (SELECT b.* 
             FROM banner b
            WHERE b.comune_number = 9
UNION ALL
           SELECT b2.*
             FROM banner b2
            WHERE b2.comune_number = 0
         GROUP BY b2.image) r
 GROUP BY r.image;

现场演示。

于 2013-07-22T12:30:27.630 回答
1
select * from 
(SELECT * FROM banner order by 
FIELD(comune_number,10,0))
abc  group by `image`;

小提琴

更新:

带过滤条件的查询:

select * from 
(SELECT * FROM banner
where comune_number in (10,0) order by 
FIELD(comune_number,10,0))
abc  group by `image`;
于 2013-07-22T12:30:42.903 回答
0

一个重要的提示。当您使用 GROUP BY 时,您放入字段列表中的所有字段必须在 GRUOP BY 子句中或必须在聚合函数中。MySql 有一个奇怪的行为,不要签署错误,但如果你在另一个 DBMS 中尝试你的查询:

SELECT * FROM banner GROUP BY image

你有一个错误。

MySql 通过隐式限制 1 申请组中不存在的字段。

关于您的问题的解决方案:

SELECT * FROM banner b1
WHERE b1.comune_number <= 'YOUR_CATEGORY'
    AND NOT EXISTS
    (SELECT 'X' FROM banner b2
    where b2.image = b1.image
    and b2.comune_number > b1.comune_number
    AND b2.comune_number <= 'YOUR_CATEGORY')

编辑我已经更改了查询,现在我设置了一个关于输入类别的条件。在您找到 YOUR_CATEGORY 的地方放置您看到的类别的值(即 9)。

于 2013-07-22T12:23:50.700 回答
-1

我不确定这是否正是您需要的,但我认为它会有所帮助。试试这个:

Select if(comune_number = 10, comune_number,0), id, image from table

您可以根据自己的方便更改 comune_number。IF 条件中的进一步嵌套也是可能的。

于 2013-07-22T13:14:18.233 回答