#javascript #mysql #sql
#javascript #mysql #sql
Вопрос:
У меня интересная ошибка, и мне интересно увидеть возможные решения. Вот ситуация: у меня есть таблица пользователей (user_id, first_name, last_name). У меня есть таблица адресов (user_id, адрес). У одного пользователя может быть несколько адресов.
Мне нужен набор результатов типа: {‘user’: user_id, ‘address’:address_array} // если у пользователя более 1 адреса, он группируется.
Я сделал это, извлекая все, отсортированное по user_id, затем просматривая результаты.
for (every item in results)
{
if (current result.user_id equal to previous one)
{
append the address to previous user
}
else
{
add the new one to my return array
}
}
Кажется, это работает нормально, за исключением того, что теперь я хочу ввести ОГРАНИЧЕНИЕ. например, мне нужны только первые 20 пользователей. Когда клиент нажимает NEXT, он пропускает первые 20 и захватывает следующие 20 записей.
Проблема в:
запись 19: пользователь 19 имеет адрес 1
запись 20: пользователь 19 имеет адрес 2
запись 21: пользователь 19 имеет адрес 3
запись 22: пользователь 19 имеет адрес 4
То, как я это сделал сейчас, первая партия из 20 покажет только, что у пользователя 19 есть только 2 адреса. Затем, когда клиент запрашивает следующие 20 результатов, пользователь 19 снова появится с двумя другими адресами.
Кроме того, я не могу использовать array.length, чтобы указать базе данных, сколько записей следует пропустить. Теперь мне нужно было бы посчитать, сколько адресов существует. Кажется, это не самый элегантный способ сделать это, поскольку код должен понимать, как устроена база данных.
Есть мысли?
Комментарии:
1. недостаточно информации. Например, какую базу данных вы используете?
2. Извините, я использую MySQL
Ответ №1:
Присоединиться с помощью подзапроса, который содержит LIMIT
:
SELECT userid, address
FROM (SELECT user_id
FROM user
ORDER BY user_id
LIMIT 0, 20) AS u
JOIN address AS a ON u.user_id = a.userid
Замените 0
на 20
для второй группы и так далее.
Ответ №2:
Я думаю, вы хотите group by
с group_concat()
и limit
:
SELECT u.user_id, GROUP_CONCAT(a.address) as addresses
FROM user u JOIN
address a
ON u.user_id = a.userid
GROUP BY u.user_id
ORDER BY u.user_id
LIMIT 0, 20;