0

我有一个包含这种形式的一些数据的数据库:

icon(name, size, tag)
(myicon.png, 16, 'twitter')
(myicon.png, 32, 'twitter')
(myicon.png, 128, 'twitter')
(myicon.png, 256, 'twitter')
(anothericon.png, 32, 'facebook')
(anothericon.png, 128, 'facebook')
(anothericon.png, 256, 'facebook')

如您所见,名称字段不是唯一的,我可以有多个具有相同名称的图标,并且它们与大小字段分开。现在在 PHP 中,我有一个获取 ONE 图标集的查询,例如:

$dbQueryIcons = mysql_query("SELECT * FROM pl_icon WHERE tag LIKE '%".$SEARCH_QUERY."%' GROUP BY name ORDER BY id DESC LIMIT ".$firstEntry.", ".$CONFIG['icon_per_page']."") or die(mysql_error());

在此示例中,如果 $tag 包含“twitter”,它将仅显示带有标签“twitter”的第一个 SQL 数据条目,因此它将是:

(myicon.png, 16, 'twitter')

这就是我想要的,但默认情况下我更喜欢“128”大小。这是否可以告诉 SQL 在现有的情况下只向我发送 128 大小,如果不是另一个大小?

在另一个问题中,有人给了我一个使用 GROUP BY 的解决方案,但在这种情况下,它不会运行,因为我们有一个 GROUP BY 名称。如果我删除 GROUP BY,它会显示相同图标的所有大小。

谢谢 !

4

3 回答 3

1

尝试使用子查询。

SELECT * FROM (

    SELECT * FROM pl_icon
    WHERE tag LIKE '%$SEARCH_QUERY%'
    ORDER BY IF(size = 128, 0, 1)

) pl_icon
GROUP BY name
ORDER BY id DESC
LIMIT ...

我们在内部查询中找到所有匹配的行,并将 size = 128 的行放在所有其他行之上。然后,对于每个唯一名称,我们仅使用 选择第一条记录GROUP BY

于 2010-05-26T11:49:34.497 回答
0

试试这个 ORDER BY 子句(id 还是 size?):

ORDER BY case when size=128 then 999999 else size end DESC
于 2010-05-26T09:01:51.343 回答
0

如果您真正想要的是获得最大尺寸的记录,那么:

SELECT name, tag, MAX(size)
FROM pl_icon 
WHERE tag LIKE '%".$SEARCH_QUERY."%' 
GROUP BY name, tag

但这里令人困惑的是“名称”不是唯一的。通常在这种情况下,人们想要识别出现最大值(或最小值)的记录——比如最后一次抄表或最大的发票。因此,如果您的表有一个 id 字段并且您想检索它:

SELECT pl2.*
FROM pl_icon pl2,
(SELECT name, tag, MAX(size) AS biggest
FROM pl_icon 
WHERE tag LIKE '%".$SEARCH_QUERY."%' 
GROUP BY name, tag) ilv
WHERE ilv.name=pl2.name
AND ilv.tag=pl2.tag
AND ilv.biggest=pl2.size;

但是,对于非常大的表/选择,这可能效率很低 - 当您可能想尝试MAX(CONCAT技巧

C。

于 2010-05-26T12:56:51.277 回答