Sütun değeri başına LIMIT 1 seçilsin mi?


11

Diyelim ki aşağıdaki tabloya sahibim

-----------------------------
| user_id   | comment       |
-----------------------------
| 2         | thats cool    |
| 2         | awesome       |
| 3         | i hate this   |
| 3         | okay          |
| 6         | this is weird |
| 6         | hello?        |
| 6         | what is it    |
| 9         | how are you   |
| 16        | too slow      |
| 16        | yes           |
| 17        | alrighty      |
-----------------------------

Her bir satır için nasıl seçim yapabilirsiniz user_id? Yani sonuçlarım:

-----------------------------
| user_id   | comment       |
-----------------------------
| 2         | thats cool    |
| 3         | i hate this   |
| 6         | this is weird |
| 9         | how are you   |
| 16        | too slow      |
| 17        | alrighty      |
-----------------------------

Tek bir verimli sorgu ile bu mümkün müdür? Yoksa alt seçimler gerekli mi? Bir şekilde DISTINCTtek bir sütunda kullanmak mümkün mü ?

Yanıtlar:


9

Bunun GROUP BYiçin kullanılır. Bir grup (grup başına) alın. Bu durumda, tüm farklı gösterecektir user_iddeğerleri ve sütunların geri kalanı için, siz (gerekir) olabilir gibi toplama işlevleri kullanmak MIN(), MAX(), AVG(), SUM()gruptaki başına birden fazla değerlere sahip olacaktır ve sadece tek gösterilebilir olarak.

SELECT
    user_id
  , MIN(comment) AS comment  -- it will show the first in alphabetical order  
                             -- you could also use MAX()
FROM
    tableX
GROUP BY
    user_id ;

MySQL, kullanıcı başına bir (daha fazla veya daha az rastgele) yorum döndüren aşağıdaki alışılmamış çözüme de izin verir:

SELECT
    user_id
  , comment
FROM
    tableX
GROUP BY
    user_id ;

Bu son sorgu çalışmaz, ancak (daha katı) ONLY_FULL_GROUP_BYmod etkinleştirilirse bir hata oluşturur . Yakın zamanda piyasaya sürülen 5.7 sürümünde, bu mod varsayılan moddur ve yeni bir işlev ANY_VALUE()olan 'sağlanır. Daha fazla ayrıntı için, bkz. MySQL KullanımıGROUP BY sayfası. Sorgu şimdi yazılabilir:

SELECT
    user_id
  , ANY_VALUE(comment) AS comment
FROM
    tableX
GROUP BY
    user_id ;

"Alışılmadık" sürümde veya son ANY_VALUE()işlev kullanılarak, SELECTlisteye daha fazla sütun eklersek , değerlerinin aynı satırdan, yalnızca aynı gruptaki bir satırdan olacağı garanti edilmez. Seçilme şekilleri tam olarak rastgele değildir, yürütme planına ve kullanılan dizinlere bağlıdır.


Bir user_id için hangi satırın alınacağını belirtmenin başka yolları var mı? ORDER BY türünü belirtmenin herhangi bir yolu var mı?
— Jake Wilson

Ayrıca MINve MAX?
— ypercubeᵀᴹ

1
O zaman daha karmaşık. Şu diğer soruya bakın: MySQL Sorgusu - En son demografik bilgileri nasıl edinebilirim?
— ypercubeᵀᴹ

2
Ayrıca SO sitesinde, [greatest-n-per-group]etiketin altında bir ton benzer sorun bulacaksınız .
— ypercubeᵀᴹ

1
@ T.BrianJones, SELECT listesine tüm diğer sütunları eklerseniz "alışılmışın dışında" sorgusunda ne demek istiyorsun? Birincisi, aynı satırdan olmayabilirler. Tam olarak rastgele değil, ancak değerler farklı satırlardan (aynı gruptan) olabilir.
— ypercubeᵀᴹ
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.