2016-10-14 1 views
0

select文に結合しようとしているクエリは次のとおりです。何が間違っているのですか?これらのクエリでmysqlが何か選択文に結合しようとしていません

​SELECT u.user_id,c.c_id,u.username,u.email, u.user_pic_path,c.time, G.file_name 
    FROM conversation c, users u 
LEFT OUTER JOIN gallery G 
ON U.user_pic_path = G.img_id 
    WHERE CASE 
    WHEN c.user_one =1 
    THEN c.user_two = u.user_id 
    WHEN c.user_two = 1 
    THEN c.user_one= u.user_id 
    END 
    AND (c.user_one =1 OR c.user_two = 1) 
    JOIN(SELECT R.time 
     FROM conversation_reply R 
     ORDER BY R.time DESC LIMIT 1) 
     ON R.c_id_fk = c.c_id 

最初のクエリで2つのテーブルを結合します。

SELECT u.user_id,c.c_id,u.username,u.email, u.user_pic_path,c.time, G.file_name 
     FROM conversation c, users u 
    LEFT OUTER JOIN gallery G 
    ON U.user_pic_path = G.img_id 
     WHERE CASE 
     WHEN c.user_one = '$user_one' 
     THEN c.user_two = u.user_id 
     WHEN c.user_two = '$user_one' 
     THEN c.user_one= u.user_id 
     END 
     AND (c.user_one ='$user_one' OR c.user_two ='$user_one') 
     Order by UNIX_TIMESTAMP(C.time) DESC Limit 20"; 

最後に、単純なクエリです。

SELECT R.cr_id,R.time,R.reply 
       FROM conversation_reply R 
       WHERE R.c_id_fk = ? 
       ORDER BY R.cr_id DESC LIMIT 1" 

ここで私は最後になりました。

$sql = "SELECT u.user_id,c.c_id,u.username,u.email, u.user_pic_path,G.file_name, 
     MAX(r.time) last_reply_time,r.reply 
FROM conversation c 
JOIN users u ON 
    CASE 
     WHEN c.user_one = 1 
      THEN c.user_two = u.user_id 
     WHEN c.user_two = 1 
      THEN c.user_one= u.user_id 
    END 
JOIN conversation_reply r ON c.c_id = r.c_id_fk 
LEFT OUTER JOIN gallery G ON U.user_pic_path = G.img_id 
WHERE (c.user_one = 1 OR c.user_two = 1) 
GROUP BY c.c_id ORDER BY last_reply_time DESC"; 

唯一のことは、最新のものではなく、最初の会話の返信を得ることです。

答えて

2

サブクエリを結合すると、サブクエリ内のテーブル名の後ではなく、サブクエリの後にエイリアスが移動する必要があります。

JOIN(SELECT time, c_id_fk 
    FROM conversation_reply 
    ORDER BY R.time DESC LIMIT 1) R 
ON R.c_id_fk = c.c_id 

しかし、これはあなたが望むことをするかどうかはわかりません。このサブクエリは、2人のユーザー間の会話だけでなく、すべての会話で最新の応答を見つけます。 2人のユーザーのうちの1人が会話していない場合、結果は表示されません。

最新の返信時間をその会話で取得したい場合は、普通のJOINconversation_replyとし、MAX(time)を選択してください。

SELECT u.user_id,c.c_id,u.username,u.email, u.user_pic_path,c.time, G.file_name, 
     MAX(r.time) last_reply_time 
FROM conversation c 
JOIN users u ON 
    CASE 
     WHEN c.user_one =1 
      THEN c.user_two = u.user_id 
     WHEN c.user_two = 1 
      THEN c.user_one= u.user_id 
    END 
JOIN conversation_reply r ON c.id = r.c_id_fk 
LEFT OUTER JOIN gallery G ON U.user_pic_path = G.img_id 
WHERE (c.user_one =1 OR c.user_two = 1) 
+0

非常にいい友達です。私はこれを試してみる。まさに私が欲しいもの。会話の最新の返信今のところ、私は単純なクエリで「OK」です。私のSQLスキルを習得して習得するために、どのような資料や本をお勧めしますか? –

+0

私は#1054を取得しています - 'フィールドリスト'に 'G.file_name'という不明な列があります –

+0

次に、 'gallery'テーブルに' file_name'列はありません。テーブルのスキーマを見て、正しい列名を見つけてください。 – Barmar

関連する問題