2016-03-23 20 views
1

ben şöyle bir tablo olan tek veritabanı var çoğaltır: Bazı satırlar yinelenen ilk/son adlara sahipPHP MySQL göster gruplandırılmış & Etiket

ID | FNAME | LNAME | DATE 

ve ben bunlar da çiftleri tespit etmek gerekiyor ve onları bir liste olarak gösterdiğimde, sayıyı göstermek için.

Ben çıkışı şöyle yapmak gerekir:

while($row = mysql_fetch_array($res)){ 
echo $row['FNAME'] . "/" . $row['FNAME']. " | ". $row['TOTAL']; 
echo "<br />"; 
} 

ben gibi olamaz:

$query = "SELECT 
      FNAME, 
      LNAME, 
      COUNT(LNAME) AS TOTAL 
      FROM user_list 
      GROUP BY LNAME"; 

PHP Kod şöyle görünür: gibi

First Name (FNAME)/Last Name (LNAME) | Duplicate? Dupe # 

Benim DB Bağlantı görünüyor Her şeyi gruplamak ve tüm sorguları göstermek de Toplamı göster/göster. |

TOM/SMITH:

Bu yüzden bir çok ölüme neden 1 MIKE/ROBS | 1 TOM/SMITH | 2

Öyleyse ... 2'den fazla giriş mevcutsa, her girişi ve Veritabanında görünen girişi gösterir. Eğer gibi olmak çıkışı gerekiyorsa

+0

Aldığınız her alanı gruplandırmanız gerekir. –

cevap

0

:

TOM/SMITH | 1 
MIKE/ROBS | 1 
TOM/SMITH | 2 

Sonra o gerçekten çok dolambaçlı olduğunu. Ama tek-ish SQL deyiminde hepsini denesek bile yapılabilir.

Adlardan başka bir sırada istediğinizi varsayarak (tüm TOM SMITH'lerin birlikte göründüğü yerlerde), benzersiz bir ID alanı eklemeniz gerekebilir ve bu ID alanına göre sıralamak istediğinizi varsayalım. iyi.

SET @name_count := 0, @prev_name := ''; 
SELECT FNAME, LNAME, namecount FROM user_list AS t1 
INNER JOIN (
    SELECT 
     ID, 
     (@name_count := IF(@prev_name = CONCAT(FNAME, ' ', LNAME), @name_count+1, 1)) AS namecount, 
     (@prev_name := CONCAT(FNAME, ' ', LNAME)) AS prevname 
    FROM (SELECT * FROM user_list ORDER BY FNAME ASC, LNAME ASC) AS tmp 
    ) AS t2 ON t1.ID = t2.ID 
ORDER BY t1.ID ASC; 

Notlar: O zaman böyle bir şey olabilir

  1. SQL değişkenleri @name_count ve @prev_name select deyimi, BY böylece iç SİPARİŞ sırasına bağlıdır yok.
  2. İç alt sorgu, adına göre sıralar ve her ad için yeni bir adla karşılaştığında 1'den başlayarak artan bir sıralamayı atar.
  3. (@prev_name := ...)'un (@name_count := IF(@prev_name = ..., ..., ...)'dan sonra listelenmesinin gerekmediğini veya başka bir deyişle, her bir satır için name_count atamadan önce prev_name değerini atayarak, @prev_name'ın her zaman geçerli adaya eşit olmasına neden olduğunu unutmayın.
  4. İç SQL her ad örneğine "sıralaması" atar ve dış SQL bunları orijinal düzende görüntüler.
  5. FROM (SELECT * FROM user_list ORDER BY FNAME ASC, LNAME ASC) AS tmp'un parçası bir alt sorgu olmak zorunda değildir. FROM user_list ORDER BY FNAME ASC, LNAME ASC olabilir. Ancak, bazı durumlarda, kullandığınız ORDER BY'a bağlı olarak, özellikle birden fazla alan varsa, bazı beklenmedik siparişlere neden olabileceğini fark ettim. Bu yüzden bu tabloyu başka bir alt sorgu olarak yerleştirdim - böylece ilk ve doğru ad siparişini yapabilir ve sıralamayı yapabilir.
  6. PHP'nizde iki ayrı sorgu olarak çalıştırmanız gerekebilir. Bir sorgu SET @name_count := 0, @prev_name := ''; ve diğer sorgu, dizenin geri kalanıdır.Tüm dizeyi PHP'de bir sorgu olarak koymaya çalışırsanız, çoğu durumda bir sorgu olarak ele almaya çalışır. PhpMyAdmin'de veya mysql konsolunda, bunu iki ayrı sorgu olarak kabul eder.

bunu yapmak için başka bir yol adı olarak saymak yerine çıktıyı geçerken, bu ismin son sayıma göre bir dizi tutmak MySQL ait PHP'de sayım yapmak ve artırmak adildir çıkageldi.

+0

Yalnızca sorun şu ki, bu sayıyı veriyor ama çıktı olarak şu şekilde çıktı: TOM/SMITH | 1 MIKE/ROBS | 1 TOM/SMITH | 2 Yani ... Eğer 2+ giriş mevcutsa, her girişi ve Veritabanında görünen girişi gösterir. – user2438730

+0

Her şeyden önce, çok teşekkür ederim! Ama şimdi tek sorunum: SQL sözdiziminde bir hata var; 'SELECT FNAME, LNAME, adcount FROM user_list AS t1 INNER JOIN (' 'line 2 ... kodunuz benimkinin ötesinde kullanmak için doğru sözdizimi için MariaDB sunucu sürümünüze karşılık gelen kılavuza bakın, bu yüzden ben değilim Buradan nereye gideceğinizden bile emin olun ... – user2438730

+0

Üzgünüz, PHP'nizde iki ayrı sorgu olarak çalıştırmanız gerekebilir. Bir sorgu 'SET @name_count: = 0, @prev_name: = '';' ve diğer sorgu dizgenin geri kalanı olmak gerekirse, bütün dizeyi PHP'de bir sorgu olarak koymaya çalışırsanız, bunu çoğu durumda bir sorgu olarak ele almaya çalışır.phpMyAdmin'de veya mysql konsolunda, bunu iki ayrı sorgu olarak kabul eder. – Huy