0

私は2つのテーブルを持っています:

  • ユーザー:user_id、user_zip
  • 設定:user_id、pref_ex_loc

変数$userzipとして指定される特定のuser_zipに基づいて、設定テーブルから最も人気のある単一の「pref_ex_loc」を見つける必要があります。

これが私が今持っているクエリです、そして明らかにそれは機能しません。

$popularexloc = "SELECT pref_ex_loc, user_id COUNT(pref_ex_loc) AS countloc 
       FROM settings FULL OUTER JOIN users ON settings.user_id = users.user_id 
       WHERE users.user_zip='$userzip' 
       GROUP BY settings.pref_ex_loc 
       ORDER BY countloc LIMIT 1";

$popexloc = mysql_query($popularexloc) or die('SQL Error :: '.mysql_error());
$exlocrow = mysql_fetch_array($popexloc); 
$mostpopexloc=$exlocrow[0];
echo '<option value="'.$mostpopexloc.'">'.$mostpopexloc.'</option>';

私はここで何が間違っているのですか?これからもエラーは発生しません。

4

4 に答える 4

1

ええと、1つには、COUNT()の前にコンマがありません。

SELECT pref_ex_loc, user_id COUNT(...

選択リストの各フィールドの間にコンマが必要です。

SELECT pref_ex_loc, user_id, COUNT(...

COUNT(*)の代わりに使用することをお勧めしCOUNT(pref_ex_loc)ます。この場合、どちらかが正しい答えを与えるはずですが、MySQLCOUNT(*)では通常わずかにパフォーマンスが向上します。

外部結合を使用していますが、WHERE句で、の列の1つをテストしているusersため、実質的に外部結合ではなくなります。このクエリでは、どのユーザーもpref_ex_loc値を参照していない可能性を処理する必要がない限り、単にINNERJOINが必要であると思います。SQL結合の視覚的な説明を読んでください。

また、MySQLはFULLOUTERJOINをサポートしていません

選択リスト内のあなたuser_idは、GROUP BY句にも集計関数にも含まれていない場合、グループ内の任意の1行から値を取得するあいまいなフィールドになります。user_id選択リストから削除する必要があります。

countlocで並べ替えて、DESC最初に最大値を取得します。

だから、これが私がより良いクエリとして見ているものです:

SELECT pref_ex_loc, COUNT(*) AS countloc 
FROM settings INNER JOIN users ON settings.user_id = users.user_id 
WHERE users.user_zip='$userzip' GROUP BY settings.pref_ex_loc 
ORDER BY countloc DESC LIMIT 1
于 2012-11-18T04:41:19.563 に答える
1

これにより、値が最も高い値 (最も人気のあるものを複製)pref_ex_locがリストに表示されます。

最大行数を強制的に表示するLIMITため、は使用しません。LIMITここで質問があります。最も人気のある pref_ex_loc と結び付いている行が 2 つ以上ある場合はどうなるでしょうか。

SELECT  b.pref_ex_loc
FROM    users a
        INNER JOIN settings b
            ON a.user_ID = b.user_ID
WHERE   a.user_zip = 1  -- change the value here
GROUP BY    b.pref_ex_loc
HAVING COUNT(*) =
(
  SELECT MAX(totalCount)
  FROM
  (
    SELECT  b.pref_ex_loc, COUNT(*) totalCount
    FROM    users a
            INNER JOIN settings b
                ON a.user_ID = b.user_ID
    WHERE   a.user_zip = 1  -- change the value here
    GROUP BY    b.pref_ex_loc
  ) s
)
于 2012-11-18T07:20:11.463 に答える
1

これを試してください:

select s.pref_ex_loc from settings s
join users u on (u.user_id = s.user_id)
where user_zip = $userzip
group by s.pref_ex_loc
order by count(*) desc
limit 1

あなたが言ったように、これにより、「特定のuser_zipに基づく設定テーブルから最も人気のある単一の「pref_ex_loc」」が得られます

于 2012-11-18T04:55:06.410 に答える
0

次のクエリを試してください。

SELECT user_id, COUNT(pref_ex_loc) AS countloc
FROM users LEFT JOIN settings ON users.user_id = settings.user_id
WHERE users.user_zip='$userzip' GROUP BY user_id ORDER BY countloc LIMIT 1
于 2012-11-18T04:48:30.590 に答える