SELECT COUNT (DISTINCT adı), kimliği, adres kullanıcılardan

5 Cevap php

PHP ile bir SQL sorgusu çalıştırmak ve normal sütunları gibi SAYISININ seçmeye çalışıyorum.

$sql_str =  "select COUNT(DISTINCT name), id, adress from users";
$src = mysql_query($sql_str);

while( $dsatz = mysql_fetch_assoc($src) ){
    echo $dsatz['name'] . "<br>";
}

Sorun olduğunda "COUNT (DISTINCT adı)," benim sorgu, sadece ilk giriş dönmek olacaktır. Bunu kaldırmak, bu db tüm eşleşen girişleri dönecektir.

Bunu ayırmak ve 2 sorguları yapmak, ama nedeniyle performans kaygıları Bunu önlemek için çalışıyorum olabilir.

What do I make wrong? thx, Mexx

5 Cevap

The ability to mix normal columns and aggregate functions is a (mis)feature of MySQL. You can even read why it's so dangerous on MySQL's documentation: https://dev.mysql.com/doc/refman/5.6/en/group-by-extensions.html

Eğer gerçekten tek bir sorguda normal satırları ve bir özetini karıştırmak istiyorsanız Ama, her zaman UNION deyimi kullanabilirsiniz:

SELECT COUNT(DISTINCT name), null, null FROM users GROUP BY name --summary row
UNION
SELECT name, id, address FROM users --normal rows

COUNT() bir toplama işlevi bu sorgu kalanı sonuçlarına karşı agrega vardır. Tüm farklı isimleri değil, id ve address seçtikten olduğu ile ilgili sadece farklı isimler saymak isterseniz, o zaman evet, iki sorgu çalıştırmak zorunda olacak. SQL böyle çalıştığını.

Toplayarak zaman da bir group by madde olması gerektiğini unutmayın. Ben MySQL bunu gerektirmez gerçeği korkunç olduğunu düşünüyorum, ve bu gerçekten kötü alışkanlıkları teşvik eder.

Kimden ne anlıyorum, sen almak istiyorum:

  • her ad / id / adresini almak için kullanıcı başına bir satır,
  • aynı ada sahip kullanıcıların sayısını almak için aynı anda birden çok kullanıcı için bir satır.

Bu çok mümkün değil, derdim.


A solution would be, like you said, two queries...

... Or, in your case, you could do the count on the PHP side, I suppose.
ie, not count in the query, but use an additionnal loop in your PHP code.

Eğer grup alanların kalanını gerektiği alan listesinin bir parçası olarak bir sayısı (). Varsa Olacağını sizin durumda

select count(distinct name), id, adress from users group by id, adress

Ben tüm kullanıcıları ve aynı sorguda toplam sayısını almak istiyorum varsayarak yaşıyorum.

Denemek

  select name, id, address, count(id) as total_number 
    from users 
    group by name, id, address;