编辑以获得更好的例子:
我试图获取DISTINCT名称列表以及这些不同名称的总列数,而不是每个名称计数而是列。像这样:
id | date | name
----|--------------|--------
1 | 2017-06-23 | Peter
2 | 2017-06-23 | Sue
3 | 2017-06-23 | Mag
4 | 2017-06-23 | Sue
5 | 2017-06-23 | Paul
6 | 2017-06-23 | Paul
7 | 2017-06-23 | Sue
预期结果将在单个数组ORDER BY name DESC
和limit 3:
MAG
PAUL
Peter
3
如果查询超过,则总计数将是限制,如果查询未超过限制,则总计数为。
解 由于在一个mysql查询中似乎很难实现预期的结果,我选择了一个更简单,更快速的解决方案,它将减少mysql查询时间。
查询 SELECT DISTINCT name FROM my table ORDER by name DESC LIMIT 3;
由于我打算使用php foreach来操作结果,我只计算了foreach中的名字。
$count_names = 0;
foreach($name as $count ){
$my code to manipulate names;
$count_names++;
}
echo $count_names; Gives me the total names.
使用查询LIMIT是因为它每天更新一个巨大的数据库,可能限制为1000,$ count_ip将返回1000.但如果每日名称更新小于1000,则查询返回比LIMIT小的值和$ count_ips将返回正确的较小名称计数。 谢谢
答案 0 :(得分:1)
在MySQL中:
set @num = 0;
SELECT name FROM (
SELECT name, @num := @num + 1 AS num
FROM (
SELECT name
FROM mytable
GROUP BY name
ORDER BY name
LIMIT 3
) AS a
UNION
SELECT @num as name, @num AS num
) AS b
(以下是使用SQL fiddle from fortune's answer)
的变体的示例关于为什么你想这样做...... 耸肩:)
注意,如果你在一个真正的RDBMS中这样做,并且你不喜欢变量和内部select语句和联合的所有技巧,你可以只做内部选择(对它有限制的那个)和返回那里的所有结果,但使用语言的“结果集大小”功能(例如:rowCount(),num_results,等等)来获取你的最后一行,即总数。
答案 1 :(得分:0)
请检查这是你想要的:
SELECT GROUP_CONCAT(DISTINCT name), COUNT(DISTINCT name) from table;
参考:草莓和Tik的评论
<强> 更新 强>
(SELECT DISTINCT(name) from table ORDER BY name LIMIT 3)
UNION
(SELECT IF(COUNT(DISTINCT(name)) > 3, 3, COUNT(DISTINCT(name))) FROM table )
答案 2 :(得分:0)
只是发现它更容易和mysql光。
$count_names = 0;
foreach($name as $count ){
$my code to manipulate names;
$count_names++;
}
echo $count_names; Gives me the total names.