#mysql #sql
#mysql #sql
Вопрос:
У меня есть две таблицы
table 1 : id, name, age, gender.
table 2(friend) : id1,id2. (stored only once i.e only one entry for a unique pair)
Мне нужно написать запрос, который принимает идентификатор, а затем возвращает результирующий набор, содержащий строки из таблицы 1, соответствующие всем его / ее друзьям.
Я попробовал этот запрос
"SELECT * FROM table1 WHERE id IN ("
"(SELECT id2 FROM table2 WHERE (id1=" given_id ")) UNION "
"(SELECT id1 FROM table2 WHERE (id2=" given_id ")));"
но, похоже, это не работает, говорит о синтаксической ошибке … кто-нибудь может помочь мне с этим запросом.
Усилия приветствуются … Большое спасибо
Ответ №1:
Вам нужно заключить в одинарные кавычки given_id
, потому что в противном случае MySQL подумает, что это имя столбца.
Этот код также будет работать, если given_id
это число.
"SELECT t1.* "
"FROM table1 t1 "
"INNER JOIN table2 t2 ON (t1.id = t2.id1 OR t1.id = t2.id2) "
"WHERE '" given_id "' IN (t2.id1, t1.id) "
Комментарии:
1. но given_id — это int … так что все должно работать правильно … также это может привести к ошибке, что имя столбца не найдено правильно?
2. @koool, пожалуйста, не голосуйте за людей
for effort
, голосуйте только за людей, если ответ действительно правильный.
Ответ №2:
Пожалуйста, используйте запрос объединения:
"SELECT `table1`.* FROM (`table1`)
LEFT OUTER JOIN `table2` ON
`table1`.`id` = `table2`.`id1`
WHERE `table2`.`id2` =
" given_id;
Ответ №3:
Вы можете сузить свои результаты, ограничив условия для объединения. Поскольку вам нужно будет объединить ваш table2 с более чем одним идентификатором, вам придется присоединиться к нему дважды и использовать псевдонимы имен таблиц.
Я считаю, что что-то подобное может помочь:
SELECT table1.*
FROM table1
JOIN table2 t2 ON table1.id = t2.id2
AND t2.id1 = {given_id}
JOIN table2 t3 ON table1.id = t3.id1
AND t3.id2 = {given_id};
Комментарии:
1.
you cannot do nested queries in the where statement in SQL
Это нонсенс, вы можете выполнять вложенные выборки практически в любом месте, если каждый подвыбор (которого нет вIN
предложении) имеет свой собственный псевдоним.2. Вы правы. Не знаю, о чем я думал. Я отредактирую комментарий, чтобы сделать его менее вводящим в заблуждение.
Ответ №4:
Вы можете сделать что-то подобное этому.
SELECT * FROM table1 t1, table2 t2, WHERE t1.id = t2.id2
Комментарии:
1. Привет, извините, у меня было две опечатки в моем предыдущем вопросе, не могли бы вы взглянуть на отредактированную версию… Большое спасибо 1
2. -1 Для использования неявного синтаксиса соединения. (Сейчас нет голосов). 1989 хочет вернуть свои анти-шаблоны.
3. Была таблица отношений, но он обновил свой вопрос и удалил его. Проверьте историю
4. Ага, запрос неверен, и вы оставили несколько синтаксических ошибок. И это действительно не соответствует ни одной версии вопроса.