MySQL的选择名称和总名称列数

MySQL的选择名称和总名称列数

问题描述:

编辑了一个更好的例子:MySQL的选择名称和总名称列数

我试图让不同的名称的列表,以及这些不同名称的总列数,而不是每个名字计数,但列。像这样:

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 DESClimit 3:

MAG 
PAUL 
Peter 
3 

如果查询超过或总计数,如果查询不超过限制的总数将是上限。

SOLUTION 因为它似乎是难以实现在一个MySQL查询我选择以更简单,更快的解决方案,将ASLO砍掉MySQL查询时间预期的结果。

查询 SELECT DISTINCT名称FROM我的表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. 

限制查询使用,因为它是每天一个巨大的数据库更新,可能限制将是1000和$ count_ip的将返回1000,但如果每天名称更新小于1000的查询返回一个较小的值比LIMIT和$ count_ips将返回正确的较小名称计数。 感谢

+0

SELECT GROUP_CONCAT(名称),COUNT(DISTINCT名)... – Strawberry

+0

感谢草莓,它不给我正确的结果:Peter-> Sue-> MAG-> Paul-> 4 ...相反,它给了我:Peter-> 1Sue-> 1Mag-> 1Paul-> 1 – Box

+1

RDBMS中的行表示无序集合。除ORDER BY表达式定义的顺序外,它们没有顺序。 – Strawberry

只要找到它更容易和mysql轻。

$count_names = 0; 

foreach($name as $count){ 

$my code to manipulate names; 

$count_names++; 
} 
echo $count_names; Gives me the total names. 
+0

提示您可能会遇到的未来问题:如果基于非SQL查询的答案可以被SQL查询问题接受,则应该在您的问题中明确声明。否则,如果你用你所问的边界之外的某个东西来回答自己的问题,那么你的问题就会被SO MOD所标记,而且没有人想要:D –

请检查这是你想要什么:

SELECT GROUP_CONCAT(DISTINCT name), COUNT(DISTINCT name) from table; 

编号:草莓注释和笛

UPDATE

(SELECT DISTINCT(name) from table ORDER BY name LIMIT 3) 
    UNION 
(SELECT IF(COUNT(DISTINCT(name)) > 3, 3, COUNT(DISTINCT(name))) FROM table) 

SQLFIDDLE DEMO

+0

嗨,谢谢...不,这是不给列的名称SELECT GROUP_CONCAT(DISTINCT(名称)),COUNT(DISTINCT名称)从表中给出的总数给我:Peter-> 1 Sue-> 1 Mag-> 1 Paul - > 1而不是Mag Peter Sue 4 – Box

+0

根据您的要求,这是yielding,看到这里,http://sqlfiddle.com/#!9/eb004/3 – fortune

+0

嗷终于....它确实给出了4名和总数。现在唯一的问题是它创建了2个数组(名称...昏迷分离)和Total。是否有可能将第一个数组分成4个数组,每个名称+总数组?另外如何按名称命名,按名称命名DESC并在将来限制为0,1000? – Box

在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中执行此操作,并且您不喜欢所有使用变量和内部选择语句和联合的欺骗,则可以执行内部选择(具有限制的选择)并返回所有结果但使用语言的“结果集大小”功能(例如:rowCount(),num_results,无论)来获得最后一行,这将是总数。

+0

好的答案以及:) – fortune