2

I have two tables named letter and letter_person like this :

letter :

id | subject | body | time
==========================
 1 |  Hello  | null | ...
 .
 .
 .

and letter_person :

id | ref_person | ref_letter |   role
========================================
 1 |     1      |     1      |   sender
 2 |     2      |     1      |  receiver
 .
 .
 .

role is an enum field and can be sender or receiver

i want to select letters which are sent and received between two persons, i want something like this :

SELECT * FROM letter
JOIN letter_person ON letter_person.ref_letter = letter
WHERE
(letter_person.ref_person = 1 AND letter_person.role = 'sender') 
OR
(letter_person.ref_person = 2 AND letter_person.role = 'receiver')

But it's not exactly what i need.

This query selects all the letters which are sent by person1 + all the letters which are received by person2.

I need to get the conversation.

4

4 に答える 4

1

あなたはこのように考えることができます

SQL フィドル

MySQL 5.5.32 スキーマのセットアップ:

create table letter(id int, subject varchar(10));
create table letter_person(id int, ref_person int, ref_letter int, role varchar(1));

insert into letter values(1, 'hello1');
insert into letter values(2, 'hello2');

insert into letter_person values(1, 1, 1, 's');
insert into letter_person values(1, 2, 1, 'r');
insert into letter_person values(1, 3, 2, 's');
insert into letter_person values(1, 2, 2, 'r');

クエリ 1 :

SELECT l.* FROM letter l
INNER JOIN letter_person lps ON l.id = lps.ref_letter AND lps.ref_person = 1 AND lps.role='s'
INNER JOIN letter_person lpr ON l.id = lpr.ref_letter AND lpr.ref_person = 2 AND lpr.role='r'

結果

| ID | SUBJECT |
|----|---------|
|  1 |  hello1 |
于 2013-11-14T20:23:20.570 に答える
0

このようなことができます

SELECT * FROM letter
JOIN letter_person ON letter_person.ref_letter = letter
WHERE 
(letter_person.ref_person = 1 AND letter_person.role = 'sender') 
AND letter_person.ref_letter in (
    SELECT letter_person.ref_letter FROM letter_person
    WHERE
    (letter_person.ref_person = 2 AND letter_person.role = 'receiver')
)
于 2013-11-14T20:05:14.457 に答える