質問

PHPを使用して、SQLクエリを実行し、COUNTと同様に通常の列を選択しようとしています。

$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>";
}

問題は、&quot; COUNT(DISTINCT name)&quot;がある場合です。私のクエリでは、最初のエントリのみが返されます。削除すると、一致するすべてのエントリがデータベースから返されます。

これを分離して2つのクエリを実行できますが、パフォーマンスの問題のため、これを回避しようとしています。

何が間違っていますか? thx、Mexx

役に立ちましたか?

解決

通常の列と集計関数を混在させる機能は、MySQLの(誤)機能です。 MySQLのドキュメントで、なぜそんなに危険なのかを読むこともできます。 https://dev.mysql.com/doc/ refman / 5.6 / en / group-by-extensions.html

ただし、通常の行と要約を1つのクエリで混在させたい場合は、常にUNIONステートメントを使用できます。

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

他のヒント

COUNT()は集計関数であり、クエリの残りの結果に対して集計します。選択している id address に関連付けられている個別の名前だけでなく、すべての個別の名前をカウントする場合は、はい、2つのクエリを実行する必要があります。これがSQLの仕組みです。

集約するときは、 group by 句も必要です。 MySQLはそれを必要としないという事実は恐ろしいことであり、本当に悪い習慣を助長すると思います。

私が理解していることから、あなたは取得したい:

  • ユーザーごとに1行、各名前/ ID /アドレスを取得する
  • 同じ名前のユーザーの数を取得するために、同時に複数のユーザーの1行。

これはまったく不可能です、私は言います。


あなたが言ったように、解決策は2つのクエリです...

...または、あなたの場合、PHP側でカウントを行うことができると思います。
つまり、クエリには含まれませんが、PHPコードで追加ループを使用します。

フィールドリストの一部としてcount()がある場合、残りのフィールドをグループ化する必要があります。あなたの場合は

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

同じクエリですべてのユーザーと合計数を取得することを想定しています。

試す

  select name, id, address, count(id) as total_number 
    from users 
    group by name, id, address;
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top