web-gelistirme-sc.com

MySQL - Bir sütunun DISTINCT olduğu tüm sütunları SEÇİN

Soru çok basit görünüyorsa çok üzgünüm.
Bitmiş bir çözüm için tüm Internet ve StackOverflow'da gezindim ve anlayabileceğim ve kendim yazamadığım hiçbir şey bulamadım, o yüzden burada sormak zorundayım.

Bir MySQL veritabanım var.
.__ "Gönderilen" adında bir masa var.
8 sütun var.

Bu sonucu vermem gerekiyor:

SELECT DISTINCT link FROM posted WHERE ad='$key' ORDER BY day, month

Ancak sadece "link" sütununa değil, bu satır için diğer sütunlara da ihtiyacım var.
Bu sorgu ile döndürülen her satırda olduğu gibi, tablodaki "id", "day" ve "month" değerlerini vb.

Lütfen bunu yapmak için ne okumam gerektiğini ya da nasıl yapmam gerektiğini söyle.
Lütfen MySQL konusunda uzman olmadığım için mümkün olduğunca basit tutun.

Düzenleme: Bunu denedim:

SELECT DISTINCT link,id,day,month FROM posted WHERE ad='$key' ORDER BY day, month

Çalışmıyor. Çok fazla satır döndürüyor. Diyelim ki aynı bağlantıya sahip 10 satır var, ancak farklı gün/ay/id. Bu komut dosyası 10'un hepsini döndürecek ve yalnızca birincisini istiyorum (bu bağlantı için).

49
John Smith

Sorun içgüdüsel olarak DISTINCT öğesinin bir sütun için yerel bir ön değiştirici olduğuna inanmaktan kaynaklanıyor.

Dolayısıyla, "gerekir" yazabilmeniz gerekir

XXbadXX SELECT col1, DISTINCT col2 FROM mytable XXbadXX 

ve col2 için benzersiz değerler döndürmesini sağlayın. Üzgünüm hayır. DISTINCT aslında SELECT için global bir post-değiştirici, yani SELECT ALL (tüm cevapları döndürerek) yerine SELECT DISTINCT (tüm benzersiz cevapları döndürerek). Böylece, tek bir DISTINCT, verdiğiniz TÜM sütunlara etki eder. 

Bu, çok büyük çirkin backflips yapmadan, diğer sütunları alırken DISTINCT öğesini tek bir sütunda kullanmayı gerçekten zorlaştırır. 

Doğru cevap, benzersiz cevaplara sahip olmak istediğiniz sütunlarda bir GROUP BY kullanmaktır:SELECT col1, col2 FROM mytable GROUP BY col2, size col2 verileriyle birlikte rasgele benzersiz col1 satırları verir.

81
DragonLord

Bunu denedim:

SELECT DISTINCT link,id,day,month FROM posted
     WHERE ad='$key' ORDER BY day, month

Çalışmıyor. Çok fazla satır döndürüyor. Diyelim ki 10 tane satır var. Aynı bağlantılar, ancak farklı gün/ay/id. Bu betiğin tümü geri dönecektir. 10 ve sadece bir tanesini istiyorum (bu bağlantı için).

İstediğiniz şey mantıklı değil.

link, id, day, month 'nin tümünün farklı bir değerini istersiniz veya kullanmak istediğiniz id, day, month değerlerinden hangisini kullanmak istediğinize dair bir ölçüt bulmanız gerekir, eğer sadece link öğesinin en az bir değerinden birini istiyorsanız.

Aksi halde, peşinde olduğunuz şey MySQL'in GROUP BY/HAVING deyimlerindeki gizli sütunlarına benzer, standart olmayan SQL'dir ve oldukça kafa karıştırıcı olabilir.

Belirli bir link değeri için herhangi bir satırı seçmek mantıklıysa, aslında bir GROUP BY link kullanabilirsiniz.

Alternatif olarak, her bir id değeri için minimum link olan satırı seçmek için bir alt seçim kullanabilirsiniz ( this answer bölümünde açıklandığı gibi):

 SELECT link, id, day, month FROM posted
     WHERE (link, id) IN
           (SELECT link, MIN(id) FROM posted ad='$key' GROUP BY link)
8
Bruno

İstediğiniz şey sadece onlar için 1 bağlantıya sahip satırları göstermekse aşağıdakileri kullanabilirsiniz:

SELECT * FROM posted WHERE link NOT IN 
(SELECT link FROM posted GROUP BY link HAVING COUNT(LINK) > 1)

Yine, bu yinelenen bir bağlantıya sahip herhangi bir şeyi kesmek istediğinizi varsayar.

3
Joe Meyer

Bence en iyi çözüm, bir alt sorgu yapmak ve sonra bunu masaya dahil etmek olacaktır. Alt sorgu, tablonun birincil anahtarını döndürür. İşte bir örnek:

select *
from (
          SELECT row_number() over(partition by link order by day, month) row_id
          , *

          FROM posted 
          WHERE ad='$key' 
          ) x
where x.row_id = 1

Bunun yaptığı şey ise row_number işlevi, sorguyla sonuçlanan her bir ayrı bağlantı tarafından bölümlenmiş sayısal bir dizi koyar.

Yalnızca = 1 olan row_numbers komutunu alarak, her bağlantı için yalnızca 1 satır döndürürsünüz.

Hangi bağlantının "1" olarak işaretlendiğini değiştirme şekliniz, row_number işlevindeki order-by cümlesidir.

Bu yardımcı olur umarım.

2
Walker Farrow
SELECT Id, Link, Day, Month FROM Posted
WHERE Id IN(
   SELECT Min(Id) FROM Posted GROUP BY Link)
2
Sinaesthetic
SELECT DISTINCT link,id,day,month FROM posted WHERE ad='$key' ORDER BY day, month

OR

SELECT link,id,day,month FROM posted WHERE ad='$key' ORDER BY day, month
2
mlishn

Bağlantının benzersiz olduğu tüm sütunları istiyorsanız:

SELECT * FROM posted WHERE link in
     (SELECT link FROM posted WHERE ad='$key' GROUP BY link);
1
Zonata

İstediğiniz şey şudur:

SELECT DISTINCT * FROM posted WHERE ad='$key' GROUP BY link ORDER BY day, month

Örneğin, bağlantının aynı olduğu 4 satır varsa, sadece bir tanesini seçecektir (ilkini kabul ediyorum).

1
Failon
  SELECT OTHER_COLUMNS FROM posted WHERE link in (
  SELECT DISTINCT link FROM posted WHERE ad='$key' )
  ORDER BY day, month
1
arunmoezhi

MySQL'de sadece "grupla" kullanabilirsiniz. Aşağıda DISTINCT "col" ile TÜMÜ seçecektir.

SELECT *
FROM tbl
GROUP BY col
0
Robert Sinclair

SELECT a. * FROM INNER JOIN siparişi verir (SELECT kursu, MAX (id) id, WHERE adından emir olarak admission_id = ". $ İd." .id = b.id

Yukarıdaki Sorgu ile nerede koşuluyla benzersiz kayıtlar alacaksınız

0
abhinandan dev

Ben de benzer bir problem yaşadım, belki birisine yardım ettim, örneğin - 3 sütunlu masa

SELECT * FROM DataTable WHERE Data_text = 'test' GROUP BY Data_Name ORDER BY Data_Name ASC

veya 

SELECT Data_Id, Data_Text, Data_Name FROM DataTable WHERE Data_text = 'test' GROUP BY Data_Name ORDER BY Data_Name ASC

İki yol benim için çalışıyor.

0
syp_dino