【问题标题】:Mysql Unique QueryMysql唯一查询
【发布时间】:2009-10-02 04:30:14
【问题描述】:
我有一个节目列表数据库,其中一个节目所需的所有信息都打包到一张表中(我应该将节目和剧集拆分成自己的)现在因为任何给定节目都有多个剧集,所以我希望显示主页仅使用升序和选定字母的标题名称。现在我知道如何进行基本查询了,但这就是我所知道的全部
SELECT DISTINCT title FROM program_table WHERE title LIKE '$letter%'
我知道我会使用它。但是我正在使用动态图像加载,它需要一个序列号才能完整地返回该图像,所以我如何让标题与众不同,同时还从该标题加载序列号?
我希望我已经清楚了。
感谢您的帮助
保罗
【问题讨论】:
标签:
php
mysql
unique
distinct
【解决方案1】:
您可以将DISTINCT 关键字替换为GROUP BY 子句。
SELECT
title
, series_number
FROM
programme_table
WHERE title LIKE '$letter%'
GROUP BY
title
, series_number
目前还有两个其他有效选项:
Mohammad 建议的选项是使用 HAVING 子句而不是 WHERE 子句,这实际上不太理想:
WHERE 子句用于限制记录,也被查询优化器用来确定要使用哪些索引和表。 HAVING 是对最终结果集的“过滤器”,在 ORDER BY 和 GROUP BY 之后应用,因此 MySQL 无法使用它来优化查询。
所以HAVING 不是那么理想,你应该只在不能使用 'WHERE' 来获得结果时才使用它。
quosoo 指出DISTINCT 关键字对查询中列出的所有列都有效。确实如此,但一般人不推荐它(没有性能差异 *在某些特定情况下存在性能差异***)**。然而,MySQL 优化器为两者输出相同的查询,因此没有实际的性能差异。
更新
虽然 MySQL 确实对两个查询应用了相同的优化,但实际上存在差异:当 DISTINCT 与 LIMIT 子句结合使用时,MySQL 一旦找到足够的唯一行就会停止。所以
SELECT DISTINCT
title
, series_number
FROM
programme_table
WHERE
title LIKE '$letter%'
其实是最好的选择。
【解决方案2】:
select title,series_number from programme_table group by title,series_number having title like '$letter%';
【解决方案3】:
DISTINCT 关键字实际上适用于列列表,因此如果您只是将系列添加到查询中,它应该返回一组唯一的标题、系列组合:
SELECT DISTINCT title, series FROM programme_table WHERE title LIKE '$letter%'
【解决方案4】:
嘿,谢谢你,但我有大约 1000 个相同系列的条目,因此它会单独列出该系列以及使大约 999 个程序无用且不显示。
然而我发现让它独一无二并显示序列号
SELECT * FROM 4 a INNER JOIN (SELECT title, MIN(series) AS MinPid FROM 4 WHERE title LIKE '$letter%' GROUP BY title) b ON a.title = b.title AND a.series = b。最小PID
希望它对将来的任何人有所帮助,并感谢您的回复:)