2016-08-08 20 views
2

私はconversationテーブルを持っています。このテーブルには、外部キーとして2つのユーザーIDと、ユーザーの詳細を含むユーザーテーブルが含まれています。 conversationテーブルをユーザーテーブルに結合して返しますが、IDがパラメータとして送信されていないユーザーの名前と姓を表示するクエリを作成したいとします。例えば条件付きSQL JOIN

CREATE TABLE `conversation` (
    `id` int(11) unsigned NOT NULL AUTO_INCREMENT, 
    `user_one_id` int(11) NOT NULL, 
    `user_two_id` int(11) NOT NULL, 
    PRIMARY KEY (`id`) 
) 

CREATE TABLE `user` (
    `id` int(11) unsigned NOT NULL AUTO_INCREMENT, 
    `name` varchar(255) NOT NULL, 
    `surname` varchar(255) NOT NULL, 
    PRIMARY KEY (`id`) 
) 

私が持っている

会話

id  user_one_id  user_two_id 
1  1    2 

ユーザー:

id  name   surname 
1  userone_name userone_surname 
2  usertwo_name usertwo_surname 
は私がuser_twoの名前と姓を返しますクエリをしたいですユーザーではなく、参加する 1。 私の現在のクエリ:

SELECT c.id, c.user_one_id, c.user_two_id, u.name, u.surname * FROM conversation c 
     JOIN user u 
     WHERE c.user_one_id = 1 
     OR c.user_two_id = 1 
     AND IF (c.user_one_id = u.id, c.user_two_id = u.id, c.user_one_id = u.id) 
     GROUP BY c.id 
     ORDER BY c.date DESC; 
+0

一般GROUPがない会話をユーザーに与えますrule:GROUP BY句が指定されている場合、SELECTリスト内の各列参照は、グループ化列を識別するか、または集合関数の引数でなければなりません! – jarlh

答えて

4

[INNER] JOINON句を持つ必要があります。 (私はそれMySQLはあなたがそれを省略することができます欠陥を検討してください。)

基準に参加する必要があります:私にして、ユーザー1

SELECT c.id, c.user_one_id, c.user_two_id, u.name, u.surname 
FROM conversation c 
JOIN user u ON u.id IN (c.user_one_id, c.user_two_id) AND u.id <> 1 
WHERE c.user_one_id = 1 OR c.user_two_id = 1 
ORDER BY c.date DESC; 
+0

Thorstenありがとうございました。これは魅力的でした。 – Miles