Neden DISTINCT benim mysql çalışmıyor?

5 Cevap php

Neden geri dönüş aşağıdaki iki sorgu member_id ve üçüncü değil çoğaltmak?

Ben ayrı çalışmak için ikinci bir sorgu gerekir. Herzaman i çalıştırmak GROUP BY, bu sorgu inanılmaz yavaş ve resultset (değeri yanlış) farklı olarak aynı değeri döndürmez.

SELECT member_id, id 
FROM ( SELECT * FROM table1 ORDER BY created_at desc ) as u 
LIMIT 5

+-----------+--------+
| member_id | id     |
+-----------+--------+
|     11333 | 313095 |
|    141831 | 313094 |
|    141831 | 313093 |
|     12013 | 313092 |
|     60821 | 313091 |
+-----------+--------+

SELECT distinct member_id, id 
FROM ( SELECT * FROM table1 ORDER BY created_at desc ) as u 
LIMIT 5

+-----------+--------+
| member_id | id     |
+-----------+--------+
|     11333 | 313095 |
|    141831 | 313094 |
|    141831 | 313093 |
|     12013 | 313092 |
|     60821 | 313091 |
+-----------+--------+

  SELECT distinct member_id
    FROM ( SELECT * FROM table1 ORDER BY created_at desc ) as u 
    LIMIT 5

+-----------+
| member_id |
+-----------+
|     11333 |
|    141831 |
|     12013 |
|     60821 |
|     64980 |
+-----------+

benim tablo örnek

CREATE TABLE `table1` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `member_id` int(11) NOT NULL,
  `s_type_id` int(11) NOT NULL,
  `created_at` datetime DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `s_FI_1` (`member_id`),
  KEY `s_FI_2` (`s_type_id`)
) ENGINE=InnoDB AUTO_INCREMENT=313096 DEFAULT CHARSET=utf8;

5 Cevap

çalışır, onun kirli (indeks, hiçbir anahtar, geçici tablo ...) ama çalışıyor,

SELECT member_id,id 
FROM ( SELECT member_id,id, created_at FROM table1 ORDER BY created_at desc ) as u 
group by member_id ORDER BY created_at desc LIMIT 5;

DISTINCT Sadece bütün uygulayabileceğiniz bir anahtar kelime ve tek bir alanda, SELECT olduğunu. Bu veritabanı iki özdeş satır döndürmez sağlar. Iki kez ilk döner bu süre DISTINCT ile ikinci sorgu her member_id sadece bir kez döndürür nedeni budur. Sonuç kümesinde, her satır, birkaç kez aynı member_id alabilirsiniz olsa bile, gerçekten benzersizdir.

Ilk sorguda, hiçbir farklı anahtar kelime yoktur. 2. sorguda o ayrı satırları seçmektir. değil ayrı üye kimliği. Üçüncü sorguda, orada tek üyesi kimliği, bu yüzden farklı üye kimlikleri seçmektir

SELECT distinct member_id, id FROM ( SELECT * FROM table1 ORDER BY created_at desc ) as u LIMIT 5

member_id benzersiz değil. Böylece sorgu fazla satır göstermek yapar ...

Aşağıdaki dizin oluşturun:

CREATE INDEX ix_table1_createdat ON table1 (created_at);
CREATE INDEX ix_table1_memberid_createdat ON table1 (member_id, created_at);

ve bu sorgu kullanın:

SELECT  t1i.*
FROM    (
        SELECT  DISTINCT member_id
        FROM    table1 tdi
        ORDER BY
                created_at DESC
        LIMIT 5
        ) t1d
JOIN    table1 t1i
ON      t1i.id =
        (
        SELECT  t1o.id
        FROM    table1 t1o
        WHERE   t1o.member_id = t1d.member_id
        ORDER BY
                t1o.member_id DESC, t1o.created_at DESC
        LIMIT 1
        )