2009-08-11 30 views
13

Tôi muốn kéo kết quả và đếm có bao nhiêu mỗi tên được kéo nhưng không có nhóm ...MySQL: Đếm các mục nhập không có nhóm?

ví dụ tôi muốn điều này:

John Doe 3 
John Doe 3 
John Doe 3 
Mary Jane 2 
Mary Jane 2 

thay vì điều này:

John Doe 3 
Mary Jane 2 

Điều đó có ý nghĩa?

Cảm ơn.

+1

lý do không thực hiện một nhóm do là gì? Bạn có thể nhận được kết quả bạn muốn bằng cách tham gia bảng ban đầu của bạn với một nhóm theo truy vấn trên bảng đó. – pjp

+1

pjp - Tôi không nghĩ rằng anh ấy có vấn đề với việc sử dụng 'GROUP BY', anh ta không muốn kết quả cuối cùng được nhóm lại. –

+0

Có LuckyLindy là chính xác. –

Trả lời

10
SELECT b.name, a.the_count 
FROM 
    some_table b, 
    (SELECT name, COUNT(*) AS the_count 
    FROM some_table 
    GROUP BY name) AS a 
WHERE b.name = a.name 
+0

Giống như câu trả lời của tôi - nhưng tôi thích đặt tên bảng của tôi :) – pjp

+1

haha, yeah ... some_table và A/B không mô tả lắm;) –

2
SELECT mo.*, 
     (
     SELECT COUNT(*) 
     FROM mytable mi 
     WHERE mi.name = mo.name 
     ) 
FROM mytable mo 
+0

'CHỌN mo. *, ( SELECT COUNT (*) FROM mytable mi ĐÂU mi.name = mo.name và 1 = 1 và 2 = 2 và 3 = 3 ) TỪ mo mytable ĐÂU mi.name = mo.name và 1 = 1 và 2 = 2 và 3 = 3' vi phạm DRY. Làm thế nào chúng ta có thể làm điều này mà không cần lặp lại mệnh đề 'where'? – Pacerier

+0

@Pacerier: tạo bảng tạm thời và viết kết quả ở đó trước tiên. Trong các hệ thống khác, chúng ta có thể viết một CTE, nhưng MySQL không hỗ trợ chúng. – Quassnoi

+0

Bảng tạm thời có phải là giải pháp tốt không? Chúng ta không nên sử dụng con trỏ? – Pacerier

0
SELECT `name`, 
    (
     SELECT COUNT(*) 
     FROM `table` AS `alt` 
     WHERE `alt`.`name` = `table`.`name` 
    ) AS `num` 
FROM `table` 
2

Nếu bạn không muốn sử dụng một subquery, bạn cũng có thể tham gia bảng để tự như vậy: Điều đó sẽ đòi hỏi một subquery. Có lẽ một cái gì đó như thế này:

SELECT t1.name, COUNT(t2.name) 
FROM my_table AS t1 
INNER JOIN my_table AS t2 ON (t1.primary_key_field = t2.primary_key_field) 
WHERE some_conditions 
GROUP BY t1.name 
2

Điều này sử dụng group by nhưng nhận được kết quả theo định dạng bạn muốn.

SELECT Name, NG.NameCount 
FROM Names 
INNER JOIN 
    (SELECT Name, Count(1) As NameCount 
    FROM Names 
    GROUP BY Name) NG 
ON Names.Name = NG.Name 
Các vấn đề liên quan