2011-07-01 43 views
5

Tôi đang cố gắng chọn mọi thứ trong bảng và cũng tính số hàng trong bảng có cùng dữ liệu.mySql: đếm số hàng có dữ liệu giống nhau trong một cột

SELECT *, COUNT(thedate) daycount FROM `table` ORDER BY thedate DESC 

Hy vọng của tôi là phải có một truy vấn mà kết quả đầu ra ngày và số lượng hàng gắn liền với ngày đó, và đầu ra lặp sẽ được một cái gì đó như thế này:

01 tháng 1 2000 (2 hàng)
col1, col2, col3, col4
col1, col2, col3, col4

01 Tháng 1 2000 (3 dòng)
col1, col2, col3, col4
col1, col2, col3, col4
col1, col2, col3, col4

01 tháng 1 năm 2000 (6 dòng)
col1, col2, col3, col4
col1, col2, col3, col4
col1 , col2, col3, col4
col1, col2, col3, col4
col1, col2, col3, col4
col1, col2, col3, col4

vv ...

0.123.

Điều này có hợp lý không?

Trả lời

3

Nếu bạn có một bảng trông như thế này:

CREATE TABLE yourtable 
(
    datefield DATETIME, 
    col1 VARCHAR(20), 
    col2 INT NOT NULL, 
    col3 TINYINT NOT NULL, 
    col4 CHAR(5) 
); 

và bạn muốn các tội danh col1 trùng lặp .. col4 mỗi ngày nhất định, bạn sẽ chạy truy vấn này

SELECT 
    COUNT(datefield) datefield_count, 
    LEFT(all_fields,10) datefield, 
    SUBSTR(all_fields,11) all_other_fields 
FROM 
(
    SELECT 
     DATE(datefield) datefield, 
     CONCAT(DATE(datefield),'|', 
     COALESCE(col1,'<NULL>'),'|', 
     COALESCE(col2,'<NULL>'),'|', 
     COALESCE(col3,'<NULL>'),'|', 
     COALESCE(col4,'<NULL>'),'|') all_fields 
    FROM 
     yourtable 
) A 
GROUP BY all_fields; 

Dưới đây là một số dữ liệu mẫu và kết quả của truy vấn:

mysql> DROP TABLE IF EXISTS yourtable; 
Query OK, 0 rows affected (0.04 sec) 

mysql> CREATE TABLE yourtable 
    -> (
    ->  datefield DATETIME, 
    ->  col1 VARCHAR(20), 
    ->  col2 INT, 
    ->  col3 TINYINT, 
    ->  col4 CHAR(5) 
    ->); 
Query OK, 0 rows affected (0.11 sec) 

mysql> INSERT INTO yourtable VALUES 
    -> (DATE(NOW() - INTERVAL 1 DAY),'rolando',4,3 ,'angel'), 
    -> (DATE(NOW() - INTERVAL 1 DAY),'rolando',4,3 ,'angel'), 
    -> (DATE(NOW() - INTERVAL 1 DAY),'rolando',4,3 ,'angel'), 
    -> (DATE(NOW() - INTERVAL 1 DAY),'rolando',4,NULL,'angel'), 
    -> (DATE(NOW() - INTERVAL 1 DAY),'rolando',4,NULL,'angel'), 
    -> (DATE(NOW() - INTERVAL 2 DAY),'rolando',4,2 ,'angel'), 
    -> (DATE(NOW() - INTERVAL 2 DAY),'rolando',4,2 ,'angel'), 
    -> (DATE(NOW() - INTERVAL 2 DAY),'rolando',4,2 ,'angel'), 
    -> (DATE(NOW() - INTERVAL 2 DAY),'rolando',4,2 ,'angel'), 
    -> (DATE(NOW() - INTERVAL 2 DAY),'rolando',4,NULL,'edwards'), 
    -> (DATE(NOW() - INTERVAL 2 DAY),'rolando',4,NULL,'angel'), 
    -> (DATE(NOW() - INTERVAL 3 DAY),'rolando',5,2 ,'angel'), 
    -> (DATE(NOW() - INTERVAL 3 DAY),'rolando',5,2 ,'angel'), 
    -> (DATE(NOW() - INTERVAL 3 DAY),'rolando',4,2 ,'angel'), 
    -> (DATE(NOW() - INTERVAL 3 DAY),'pamela' ,4,2 ,'angel'), 
    -> (DATE(NOW() - INTERVAL 3 DAY),'pamela' ,4,NULL,'edwards'), 
    -> (DATE(NOW() - INTERVAL 3 DAY),'pamela' ,5,2 ,'angel'), 
    -> (DATE(NOW() - INTERVAL 3 DAY),'pamela' ,5,2 ,'angel'), 
    -> (DATE(NOW() - INTERVAL 3 DAY),'rolando',4,2 ,'angel'), 
    -> (DATE(NOW() - INTERVAL 3 DAY),'rolando',4,2 ,'angel'), 
    -> (DATE(NOW() - INTERVAL 3 DAY),'rolando',4,NULL,'edwards'), 
    -> (DATE(NOW() - INTERVAL 3 DAY),'rolando',4,NULL,'angel') 
    -> ; 
Query OK, 22 rows affected, 3 warnings (0.03 sec) 
Records: 22 Duplicates: 0 Warnings: 3 

mysql> SELECT * FROM yourtable; 
+---------------------+---------+------+------+-------+ 
| datefield   | col1 | col2 | col3 | col4 | 
+---------------------+---------+------+------+-------+ 
| 2011-06-30 00:00:00 | rolando | 4 | 3 | angel | 
| 2011-06-30 00:00:00 | rolando | 4 | 3 | angel | 
| 2011-06-30 00:00:00 | rolando | 4 | 3 | angel | 
| 2011-06-30 00:00:00 | rolando | 4 | NULL | angel | 
| 2011-06-30 00:00:00 | rolando | 4 | NULL | angel | 
| 2011-06-29 00:00:00 | rolando | 4 | 2 | angel | 
| 2011-06-29 00:00:00 | rolando | 4 | 2 | angel | 
| 2011-06-29 00:00:00 | rolando | 4 | 2 | angel | 
| 2011-06-29 00:00:00 | rolando | 4 | 2 | angel | 
| 2011-06-29 00:00:00 | rolando | 4 | NULL | edwar | 
| 2011-06-29 00:00:00 | rolando | 4 | NULL | angel | 
| 2011-06-28 00:00:00 | rolando | 5 | 2 | angel | 
| 2011-06-28 00:00:00 | rolando | 5 | 2 | angel | 
| 2011-06-28 00:00:00 | rolando | 4 | 2 | angel | 
| 2011-06-28 00:00:00 | pamela | 4 | 2 | angel | 
| 2011-06-28 00:00:00 | pamela | 4 | NULL | edwar | 
| 2011-06-28 00:00:00 | pamela | 5 | 2 | angel | 
| 2011-06-28 00:00:00 | pamela | 5 | 2 | angel | 
| 2011-06-28 00:00:00 | rolando | 4 | 2 | angel | 
| 2011-06-28 00:00:00 | rolando | 4 | 2 | angel | 
| 2011-06-28 00:00:00 | rolando | 4 | NULL | edwar | 
| 2011-06-28 00:00:00 | rolando | 4 | NULL | angel | 
+---------------------+---------+------+------+-------+ 
22 rows in set (0.00 sec) 

mysql> SELECT 
    ->  COUNT(datefield) datefield_count, 
    ->  LEFT(all_fields,10) datefield, 
    ->  SUBSTR(all_fields,11) all_other_fields 
    -> FROM 
    -> (
    ->  SELECT 
    ->   DATE(datefield) datefield, 
    ->   CONCAT(DATE(datefield),'|', 
    ->   COALESCE(col1,'<NULL>'),'|', 
    ->   COALESCE(col2,'<NULL>'),'|', 
    ->   COALESCE(col3,'<NULL>'),'|', 
    ->   COALESCE(col4,'<NULL>'),'|') all_fields 
    ->  FROM 
    ->   yourtable 
    ->) A 
    -> GROUP BY all_fields; 
+-----------------+------------+----------------------------+ 
| datefield_count | datefield | all_other_fields   | 
+-----------------+------------+----------------------------+ 
|    1 | 2011-06-28 | |pamela|4|2|angel|   | 
|    1 | 2011-06-28 | |pamela|4|<NULL>|edwar| | 
|    2 | 2011-06-28 | |pamela|5|2|angel|   | 
|    3 | 2011-06-28 | |rolando|4|2|angel|  | 
|    1 | 2011-06-28 | |rolando|4|<NULL>|angel| | 
|    1 | 2011-06-28 | |rolando|4|<NULL>|edwar| | 
|    2 | 2011-06-28 | |rolando|5|2|angel|  | 
|    4 | 2011-06-29 | |rolando|4|2|angel|  | 
|    1 | 2011-06-29 | |rolando|4|<NULL>|angel| | 
|    1 | 2011-06-29 | |rolando|4|<NULL>|edwar| | 
|    3 | 2011-06-30 | |rolando|4|3|angel|  | 
|    2 | 2011-06-30 | |rolando|4|<NULL>|angel| | 
+-----------------+------------+----------------------------+ 
12 rows in set (0.00 sec) 

mysql> 

Tôi sẽ để lại cho bạn sự sáng tạo trí tưởng tượng để lặp qua chuyện này và in

  • DateField
  • datefield_count
  • all_other_fields in 'datefield_count' lần

cho nó một thử !!!

0
SELECT ... 
FROM yourtable 
GROUP BY DATE(datefield) 
ORDER BY COUNT(DATE(datefield)) DESC 

lưu ý rằng tôi đang sử dụng hàm DATE(), trong trường hợp các trường ngày của bạn thực sự là ngày giờ. Nếu bạn nhóm vào thời gian ngày, nó sẽ nhóm theo yyyy-mm-dd đầy đủ hh: mm: ss, không chỉ yyyy-mm-dd và bạn sẽ nhận được kết quả hoàn toàn khác.

Điều đó sẽ giúp bạn có được kết quả cốt lõi. Làm đầu ra như bạn muốn nó sẽ cần một số hậu xử lý trong kịch bản của bạn, nhưng không quá khó. Chỉ cần đệm các hàng được tìm thấy cho đến ngày thay đổi, sau đó xuất bộ đệm với một số hàng.

+0

Tôi có đúng khi nghĩ rằng truy vấn này sẽ không trả về * (mọi thứ) từ bảng không? Chỉ dữ liệu được nhóm? "Tôi đang cố gắng chọn mọi thứ trong bảng và cũng tính số hàng trong bảng có cùng dữ liệu". – superUntitled

+1

Bạn không thể có cả hai cách. nhóm cho phép bạn thực hiện các chức năng tổng hợp, nhưng cũng "ẩn" các thành viên lặp lại của mỗi nhóm. Nếu bạn muốn cả hai, bạn cần phải thực hiện hai truy vấn. Hoặc làm một truy vấn không được nhóm và sau đó thực hiện các chức năng tổng hợp phía máy khách. –

0
SELECT *, COUNT(thedate) daycount 
FROM `table` 
GROUP BY thedate 
ORDER BY thedate DESC 
0
SELECT thedate, COUNT(id) 
FROM table 
WHERE 1 
GROUP BY thedate 
ORDER BY thedate 
1

Đây không phải là những gì OP đã hỏi, thay vì những gì tôi đã tìm kiếm khi tôi đưa ra câu hỏi này. Có lẽ một số sẽ thấy nó hữu ích.

select * 
    from thetable 
    join (
     select thedate, count(thedate) as cnt 
     from thetable 
     group by thedate 
    ) as counts 
    using(thedate) 
    order by thedate 

Các truy vấn trên sẽ chọn tất cả mọi thứ với trường bổ sung cnt chứa số lượng hồ sơ có cùng ngày. Sau đó, nó là tầm thường để in cái gì đó như:

một số ngày, 2 hồ sơ cho ngày này
col1, col2, col3, col4
col1, col2, col3, col4

một số ngày khác, 3 hồ sơ cho ngày này
col1, col2, col3, col4
col1, col2, col3, col4
col1, col2, col3, col4

chưa một ngày nào khác, 1 kỷ lục trong ngày này
col1, col2, col3, col4

Các vấn đề liên quan