Я размышлял об этом некоторое время, и он дошел до точки, где я думаю, что лучше спросить и послушать то, что думают другие люди.Точная разбивка на страницы с левыми совпадениями
Im bulding система, которая хранит местоположения на Mysql. Каждое место имеет тип, и некоторые местоположения имеют несколько адресов.
Таблицы выглядеть примерно так
location
- location_id (autoincrement)
- location_name
- location_type_id
location_types
- type_id
- type_name (For example "Laundry")
location_information
- location_id (Reference to the location table)
- location_address
- location_phone
Так что, если я хотел запросить базу данных для 10 последних добавленных я бы с чем-то вроде этого:
SELECT l.location_id, l.location_name,
t.type_id, t.type_name,
i.location_address, i.location_phone
FROM location AS l
LEFT JOIN location_information AS i ON (l.location_id = i.location_id)
LEFT JOIN location_types AS t ON (l.location_type_id = t.type_id)
ORDER BY l.location_id DESC
LIMIT 10
Правильно? Но проблема в том, что если местоположение имеет более 1 адреса, ограничение/разбиение на страницы не будет совпадать, если только я не «GROUP BY l.location_id», но это будет показывать только один адрес для каждого места .. что происходит с местами, которые имеют несколько адресов?
Так что я подумал, что единственный способ решить эту проблему, делая запрос внутри цикла .. Что-то вроде этого (псевдокод):
$db->query('SELECT l.location_id, l.location_name,
t.type_id, t.type_name
FROM location AS l
LEFT JOIN location_types AS t ON (l.location_type_id = t.type_id)
ORDER BY l.location_id DESC
LIMIT 10');
$locations = array();
while ($row = $db->fetchRow())
{
$db->query('SELECT i.location_address, i.location_phone
FROM location_information AS i
WHERE i.location_id = ?', $row['location_id']);
$locationInfo = $db->fetchAll();
$locations[$row['location_id']] = array('location_name' => $row['location_name'],
'location_type' => $row['location_type'],
'location_info' => $locationInfo);
}
Теперь им получать последние 10 мест, но, делая это, я завершите работу не менее 10 запросов, и я не думаю, что это помогает производительности приложения.
Есть ли лучший способ достичь того, что они ищут? (точная разбивка на страницы).
Какой адрес (локальная запись) вы хотите вернуть для местоположения? Если вы можете сказать, какой из них вы хотите, мы можем сообщить компьютеру, какой вы хотите. –