我有一个包含该格式的数据的数据库:
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')
因此,如您所见,名称字段不是uniq我可以有多个具有相同名称的图标,并且它们用大小字段分隔。现在在PHP中,我有一个查询设置了一个图标,例如:
$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,它会向我显示相同图标的大小。
谢谢!
答案 0 :(得分: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
选择第一条记录。
答案 1 :(得分:0)
试试这个ORDER BY子句(id或size?):
ORDER BY case when size=128 then 999999 else size end DESC
答案 2 :(得分: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技巧
时下进行。