Несколько MySQL "выбрать из" в одном запросе

SELECT (SELECT user_id ОТ пользователей WHERE user_id=1) AS user_id, (SELECT usersetting_user_id ОТ usersettings WHERE usersetting_user_id=1) AS usersetting_user_id;

это возвращает:

| user_id | usersetting_user_id |  
|       1 |                   1 |

но я хочу отобразить всех пользователей, а не только одного. Итак, я запускаю следующее:

SELECT (SELECT user_id FROM пользователей) AS user_id, (SELECT usersetting_user_id FROM usersettings) AS usersetting_user_id;``

и получить:

ERROR 1242 (21000): Subquery returns more than 1 row

Есть идеи как обойти это?

3 ответа

Решение

Вы должны использовать 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;

Я не рекомендую использовать в таких запросах как Joins или множественные запросы, потому что вы загружаете все таблицы, а затем фильтруете их. Это все равно что использовать Имея вместо Где. Он связан с версией mysql-сервера, но вы можете сравнить его с 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;

Ps Если вы знаете, что в ваших таблицах одинаковое количество строк, вы можете использовать решение с Join by Tzarium, но в качестве INNER/LEFT/RIGHT JOIN вместо JOIN или OUTER JOIN.

Другие вопросы по тегам