Назад | Перейти на главную страницу

Несколько mysql 'select from' в одном запросе

ВЫБРАТЬ (ВЫБРАТЬ 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.