0

プロジェクトのユーザー プロファイルの拡張に取り組んでおり、情報を追加しています。問題が発生したとき、国を追加していました。これは、必要なすべてのプロファイル データを選択するためのクエリです。

SELECT c.*, d.username, d.email, e.country_name
    FROM user_profiles c, users d, country e
    WHERE c.user_id = ".$id." AND d.id = ".$id."
    AND e.country_name = (SELECT country_name FROM country WHERE id = c.country_id)

c.* は、user_profiles からすべての列を選択する必要があります。

これ$idは、返されるプロファイルを選択するユーザーの ID です。問題は、登録をできるだけ簡単に保つために、そこに国のセレクターがないことです。したがって、このクエリが実行されると、user_profiles の列 country_id が空になります。つまり、country_name を返したい場合、クエリ結果が空になるため、プロファイル データは返されません。

CASEこれをorで書き直そうとしましLEFT JOINたが、何かが足りないと思います。country_id が null でないか調べたい、そうでない場合は this も選択country_nameしますcountry_id。何か案は?

返信ありがとうございます。

4

2 に答える 2

0

を使用できますが、よりクリーンで最新の構文LEFT JOINを使用して開始すると、はるかに簡単になります。JOIN

SELECT c.*, d.username, d.email, e.country_name
FROM user_profiles c 
JOIN users d ON d.id = c.id 
JOIN country e ON e.country_id = c.country_id
WHERE c.user_id = 42

問題を解決するには、次を追加するだけですLEFT

LEFT JOIN country e ON e.country_id = c.country_id

完全なクエリ:

SELECT c.*, d.username, d.email, e.country_name
FROM user_profiles c 
JOIN users d ON d.id = c.id 
LEFT JOIN country e ON e.country_id = c.country_id
WHERE c.user_id = 42

関連している

于 2012-12-23T00:34:08.270 に答える
-1

私があなたの現在の問題について考え始める前に、あなたの現在の質問が混乱していることを指摘できますか。すごく悪い。それはうまくいくかもしれません、それは効率的にさえ働くかもしれません-しかしそれはまだ混乱です:

SELECT c.*, d.username, d.email, e.country_name
FROM user_profiles c, users d, country e
WHERE d.id = ".$id." 
AND d.id = c.user_id
AND e.id = c.country_id;

これをCASEまたはLEFTJOINで書き直そうとしました

しかし、あなたは私たちにあなたのコードを見せないつもりですか?

1つの解決策は、user_profiles/usersの各行に対してサブ選択を使用することです。

SELECT c.*, d.username, d.email, 
   (SELECT e.country_name
    FROM country e
    WHERE AND e.id = c.country_id LIMIT 0,1) AS country_name
FROM user_profiles c, users d
WHERE d.id = ".$id." 
AND d.id = c.user_id;

または、LEFTJOINを使用します。

SELECT c.*, d.username, d.email, e.country_name
FROM user_profiles c
INNER JOIN users d
   ON d.id = c.user_id
LEFT JOIN country e
   ON e.id = c.country_id
WHERE d.id = ".$id.";
于 2012-12-23T00:41:30.857 に答える