【问题标题】:Get a unique data in a SQL query获取 SQL 查询中的唯一数据
【发布时间】:2010-05-26 08:35:53
【问题描述】:

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

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

谢谢!

【问题讨论】:

    标签: php sql mysql unique data-entry


    【解决方案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 选择第一条记录。

    【讨论】:

    • 运行良好!谢谢 !!!只说一件事。我看到如果没有 128 尺寸,它会显示第一个 16 号。有可能有 128 或更少?例如,如果 128 不存在,它会显示 64(如果存在)或 32 或 16 吗?谢谢
    • @Jensen,是的,有可能:ORDER BY IF (size = 128, 0, 1), IF(size < 128, 0, 1), size DESC - 这将确保以下顺序:“128;然后按降序排列低于 128 的所有内容;然后按降序排列高于 128 的所有内容”,即“128、64、32、16、256”
    • 或者更好:ORDER BY IF (size <= 128, 0, 1), size DESC :)
    【解决方案2】:

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

    ORDER BY case when size=128 then 999999 else size end DESC
    

    【讨论】:

      【解决方案3】:

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

      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.

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-11-09
        • 2021-03-28
        • 2018-11-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多