0

MySQL データベースにこの非常に奇妙な問題があります。

クエリを単純化するために、ユーザー設定に一致するプロファイルを取得するためにこのクエリを呼び出しているとしましょう。

SELECT u.*, floor(datediff(now(), u.birth_date) / 365) as age 
FROM users_wr u 
LEFT JOIN cities c ON c.id = u.city_id 
WHERE u.id != 1 and c.country_id = 71
HAVING age >= 20 AND age <= 25

このクエリは、3 行のセットを返すようになりました (これは正しいです)。ただし、次のような行数を取得したい場合:

SELECT count(*), floor(datediff(now(), u.birth_date) / 365) as age 
FROM users_wr u 
LEFT JOIN cities c ON c.id = u.city_id 
WHERE u.id != 1 and c.country_id = 71
HAVING age >= 20 AND age <= 25
LIMIT 1

次に、別のケースでは 4 を返す必要がありますが、代わりに 5 を返し続け、この場合、3 を返す必要があるときに NULL を返しています。

それが何を意味するのかわかりません。私はSQLの初心者ではありませんが、これは本当に気になります。

4

2 に答える 2

1

GROUP BY句を追加するのを忘れました

SELECT count(*), floor(datediff(now(), u.birth_date) / 365) as age 
FROM users_wr u 
LEFT JOIN cities c ON c.id = u.city_id 
WHERE u.id != 1 and c.country_id = 71
GROUP BY floor(datediff(now(), u.birth_date) / 365)
-- HAVING age >= 20 AND age <= 25
-- LIMIT 1
于 2012-12-24T00:16:58.497 に答える
0

隠し列と呼ばれるMySQLの(誤った)機能を使用しているため、SQLクエリは奇妙です。他のデータベースでは、これらのクエリは構文違反になります。これは、に集計関数と非集計列の両方があり、selectがないためgroup byです。これは悪い習慣です。

最初のケースでは、集計がないため、条件に一致する呼び出し行を取得しています。

2番目のケースでは、。がなくても、クエリは1行のみを返しますlimitwhere全体の数と、および条件を満たすランダムな年齢を取得しhavingます。

必要なクエリは次のとおりです。

select count(*)
from (SELECT u.*, floor(datediff(now(), u.birth_date) / 365) as age 
      FROM users_wr u LEFT JOIN
           cities c ON c.id = u.city_id 
      WHERE u.id != 1 and c.country_id = 71
     ) t
where age >= 20 AND age <= 25

これにより、すべての条件を満たすユーザーの数を含む1行が返されます。

于 2012-12-24T18:12:59.270 に答える