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.