Почему эти два запроса дают разные результаты для role
?Эти 2 SQL-запроса возвращают разные результаты
RIGHT результат (роль по праву ассоциируется с пользователем):
SELECT
users.*,
activations.id AS activation
(SELECT
roles.name
FROM roles
INNER JOIN role_users ON roles.id = role_users.role_id
WHERE role_users.user_id = users.id
LIMIT 1) AS role
FROM users
LEFT JOIN activations ON users.id = activations.user_id
НЕПРАВИЛЬНО результат (роль всегда первая запись roles
таблицы):
SELECT
users.*,
activations.id AS activation
(SELECT
roles.name
FROM roles
INNER JOIN role_users ON roles.id = role_users.role_id
INNER JOIN users ON users.id = role_users.user_id
LIMIT 1) AS role
FROM users
LEFT JOIN activations ON users.id = activations.user_id
Я не могу использовать первый запрос (с WHERE role_users.user_id = users.id
), и я должен использовать второй (с «JOIN»): как добиться правильного результата?
Благодаря
EDIT: ответить на комментарии:
I can't use the first query
средства, короче говоря, что я строю его Laravel Query Builder, и выражениеWHERE role_users.user_id = users.id
, переведенный в->where('role_users.user_id', '=', 'users.id')
в Laravel Query Builder, не работает, потому что он обрабатывается, как если бы он былWHERE role_users.user_id = 'users.id'
. Я могу использовать whereRaw(), но я хотел бы избежать этого и искать лучшее решение- Я не создал схему базы данных, но она исходит из Cartalyst Sentinel; это многие-ко-многим, но я забочусь, что каждый пользователь имеет только одну роль, и если пользователь имеет более одной роли, ну, возьмите первый (как там было
ORDER BY roles.id
)
Что означает 'я не могу использовать первый запрос' ,,, если это дает вам правильный результат, в чем проблема? –
Обратите внимание, что LIMIT без ORDER BY является довольно бессмысленной концепцией. В этом случае я не вижу, что должен делать LIMIT. Короче говоря, если любой запрос возвращает правильный результат, это скорее удача, чем намерение. – Strawberry