2011-07-01 13 views
5

Próbuję zaznaczyć wszystko w tabeli, a także policzyć liczbę wierszy w tabeli, które mają te same dane.mySql: liczba wierszy, które mają takie same dane w kolumnie

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

Moja nadzieja jest mieć jedną kwerendę, która wyprowadza datę i liczbę wierszy związanych z tą datą, a wyjście zapętlony będzie coś takiego:

01 styczeń 2000 (2 rzędy)
kol1, kolumna2, Col3, Col4
kol1, kolumna2, Col3, Col4

01 stycznia 2000 (3 rzędy)
kol1, kolumna2, Col3, Col4
kol1, col2, Col3, Col4
kol1, kolumna2, Col3, Col4

01 stycznia 2000 (6 rzędów)
kol1, kolumna2, Col3, Col4
kol1, kolumna2, Col3, Col4
kol1 , col2, Col3, Col4
col1, col2, Col3, Col4
col1, col2, Col3, Col4
col1, col2, Col3, Col4

etc ...

Czy to ma sens?

Odpowiedz

3

Jeśli masz tabelę, która wygląda tak:

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

i chciałeś hrabiów duplikatu col1 .. Col4 za dany dzień, należy uruchomić tę kwerendę

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; 

Oto niektóre przykładowe dane i wynik zapytania:

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> 

Zostawię ci go kreatywnością pętli to i drukować

  • datefield
  • datefield_count
  • all_other_fields 'Print' datefield_count czasy

spróbować !!!

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

Zwróć uwagę, że korzystam z funkcji DATE(), na wypadek gdyby twoje pola daty faktycznie były datami. Jeśli zgrupujesz w dniu daty, to pogrupujesz według w pełni rrrr-mm-dd gg: mm: ss, nie tylko rrrr-mm-dd, a otrzymasz zupełnie inne wyniki.

To da ci podstawowe wyniki. Wykonywanie danych wyjściowych w pożądany sposób wymaga przetwarzania końcowego w skrypcie, ale nie jest zbyt trudne. Po prostu buforuj znalezione wiersze do daty zmiany, a następnie wyprowadź bufor z liczbą wierszy.

+0

Czy mam rację myśląc, że to zapytanie nie zwróci * (wszystkiego) ze stołu? Tylko dane GROUPed? "Próbuję wybrać wszystko w tabeli, a także policzyć liczbę wierszy w tabeli, które mają te same dane." – superUntitled

+1

Nie możesz mieć tego w obie strony. grupowanie pozwala wykonywać funkcje agregujące, ale także "ukrywa" powtarzające się elementy każdej grupy. Jeśli chcesz oba, musisz zrobić dwa zapytania. Lub wykonaj niezgrupowane zapytanie, a następnie wykonaj zagregowane funkcje po stronie klienta. –

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

To nie jest to, o co prosił PO, a raczej to, czego szukałem, gdy natknąłem się na to pytanie. Być może niektórzy uznają to za przydatne.

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

Powyższe zapytanie wybrać wszystko z dodatkowym polu cnt zawierającym liczbę rekordów mających tę samą datę. To jest trywialne, aby wydrukować coś takiego:

niektóre daty, 2 rekordy dla tej dacie
col1, col2, Col3, Col4
col1, col2, Col3, Col4

jakaś inna data, 3 rekordy dla tej dacie
col1, col2, Col3, Col4
col1, col2, Col3, Col4
col1, col2, Col3, Col4

jeszcze jakaś inna data, 1 rekord dla tej dacie
col1, col2, col3, col4

Powiązane problemy