He estado pensando en esto por un tiempo y llegó a un punto en el que creo que es mejor preguntar y escuchar lo que otras personas piensan.Paginación precisa con uniones hacia la izquierda
Im construyendo un sistema que almacena ubicaciones en Mysql. Cada ubicación tiene un tipo y algunas ubicaciones tienen varias direcciones.
Las tablas tienen el siguiente aspecto
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
así que si quería para consultar la base de datos para el 10 añadidas más recientemente me gustaría ir con algo como esto:
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
derecho? Pero el problema es que si una ubicación tiene más de 1 dirección, el límite/paginación no se convertirá en accurrate, a menos que "GROUP BY l.location_id", pero eso mostrará solo una dirección para cada lugar ... ¿qué sucede? con los lugares que tienen varias direcciones?
Así que pensé que la única manera de resolver esto es haciendo una consulta dentro de un bucle .. Algo como esto (pseudocódigo):
$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);
}
Ahora Im consiguiendo los últimos 10 lugares, pero al hacer eso me terminar con al menos 10 consultas más, y no creo que eso ayude al rendimiento de la aplicación.
¿Hay alguna manera mejor de lograr lo que estoy buscando? (paginación precisa).
¿Qué dirección (registro de información local) le gustaría devolver para una ubicación? Si puede decir cuál quiere, podemos decirle a la computadora cuál quiere. –