MySql Subquery возвращает более 1 строки - PullRequest
0 голосов
/ 30 марта 2011

У меня возникли проблемы с запросом в MySQL отношения «сам-ко-многим», у меня есть таблица Person и таблица Friendship

Person
pid |имя |возраст
1 Джимми 18
2 Лукас 25
3 Мари 12
4 Мари 40
5 Джон 30

Дружба
пид |pId2
1 3
2 3
4 1
5 3


Так что мне нужно проверить, что друзья Мари (правильный ответ: Лукас и Джон)

с последующим запросом я получил ответ по pid

SELECT p.name
FROM Person p
WHERE EXISTS(SELECT NULL
    FROM Friendship f
    WHERE p.pid = f.pid
    AND (f.pid2 = 4 OR f.pid2 = 3))
OR EXISTS(SELECT NULL
    FROM Friendship f
    WHERE p.pid = f.pid2
    AND (f.pid = 4 OR f.pid = 3))  

, но что, если мне нужно запросить по имени? Следующий не работает

SELECT p.name
FROM Person p
WHERE EXISTS(SELECT NULL
    FROM Friendship f
    WHERE p.pid = f.pid
    AND f.pid2 = (SELECT pid FROM Person WHERE name = 'Marie'))
OR EXISTS(SELECT NULL
    FROM Friendship f
    WHERE p.pid = f.pid2
    AND f.pid = (SELECT pid FROM Person WHERE name = 'Marie')) 

спасибо за вашпомогите ребята

1 Ответ

0 голосов
/ 30 марта 2011

Я бы сделал это через JOIN.

SELECT fr.name FROM Person fr INNER JOIN Friendship ON(fr.pid = Friendship.pid2) INNER JOIN Person p ON(Friendship.pid = p.pid) WHERE p.name = 'Marie';

Вы также можете сделать это через JOIN и подвыбор.

SELECT name FROM Person INNER JOIN Friendship ON(Person.pid = Friendship.pid2) WHERE Friendship.pid IN (SELECT pid FROM Person WHERE name = 'Marie'); 
...