ВЫБРАТЬ (ВЫБРАТЬ user_id ИЗ пользователей WHERE user_id = 1) AS user_id, (SELECT usersetting_user_id FROM usersettings WHERE usersetting_user_id = 1) AS usersetting_user_id;
это возвращает:
| user_id | usersetting_user_id |
| 1 | 1 |
но я хочу отображать всех пользователей, а не только одного. Итак, я запускаю следующее:
ВЫБРАТЬ (ВЫБРАТЬ user_id ИЗ пользователей) КАК user_id, (ВЫБРАТЬ usersetting_user_id ИЗ пользовательских настроек) КАК usersetting_user_id; ''
и получить:
ERROR 1242 (21000): Subquery returns more than 1 row
Есть идеи, как это обойти?
Вы должны использовать join
заявление, например:
SELECT u.user_id, us.usersetting_user_id
FROM users u
JOIN usersettings us ON u.user_id = us.usersetting_user_id
Предполагается, что usersettings.usersetting_user_id - это ссылка на первичный ключ (user_id) пользователей. Подробности можно найти в руководстве.
Назначить псевдонимы в FROM
пункт, затем используйте alias.fieldname
. Также группа SELECT
и FROM
части
SELECT user_id.user_id, usersetting_user_id.usersetting_user_id
FROM users AS user_id, usersettings AS usersetting_user_id;
Я не рекомендую использовать в таких запросах, как это объединение или в нескольких запросах, потому что вы загружаете все таблицы, а затем фильтруете их. Это похоже на использование Have вместо Where. Это связано с версией mysql-server, но вы можете сравнить это самостоятельно с EXPLAIN (или EXPLAIN EXTENDED).
В вашем случае я рекомендую вам использовать одну таблицу в директиве from (базовая таблица, например, пользователи) и загружать другие данные с помощью внутренних запросов с помощью Where id = user_id.
# query with basic table only
SELECT
user_id
FROM users AS u;
# extended query
SELECT
user_id,
(SELECT usersetting_user_id
FROM usersettings
WHERE usersetting_user_id = u.user_id) AS usersetting_user_id
FROM users AS u;
P.s. Если вы знаете, что в ваших таблицах одинаковое количество строк, вы можете использовать решение с Join by Tzarium, но как INNER / LEFT / RIGHT JOIN вместо JOIN или OUTER JOIN.