在SQL查询中获取唯一数据

时间:2010-05-26 08:35:53

标签: php sql mysql unique data-entry

我有一个包含该格式的数据的数据库:

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,它会向我显示相同图标的大小。

谢谢!

3 个答案:

答案 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技巧

下进行。