Soy nuevo en SQL y me pregunto cómo seleccionar tablas anidadas. Tengo dos tablas como esta:
sensores
| sensor_id | N º de Modelo | ubicación_id |
|---|---|---|
| En t | varchar | En t |
ubicaciones
| ubicación_id | nombre | ubicación | radio |
|---|---|---|---|
| En t | varchar | punto | En t |
Están vinculados con foreign key . Actualmente, selecciono usando
SELECT sensors.*, locations.* FROM sensors INNER JOIN locations ON sensors.location_id = locations.location_id;para obtener los datos de ambos así:
{ "sensor_id": 1, "model_no": "some string", "location_id": 2, "name": "Berlin", "location": { "x": 3, "y": 3 }, "radius": 1000 }Me pregunto si hay alguna forma en que pueda mantener los datos de ubicación agrupados como su propio objeto de esta manera:
{ "sensor_id": 1, "model_no": "some string", "location": { "name": "Berlin", "location": { "x": 3, "y": 3 }, "radius": 1000 } }Estoy usando MySQL 8 con el paquete mysql npm para ejecutar las consultas. Sé que puedo modificar la respuesta usando javascript, pero me pregunto si se puede hacer directamente en la consulta y, de ser así, ¿es mejor o peor para el rendimiento?
Debe etiquetar manualmente cada columna; no puede obtener el resultado deseado y usar * .
Un pequeño premio de consolación: Si cambias
ON sensors.location_id = locations.location_id;a
USING(location_id) Solo habrá una columna location_id .
SELECT JSON_OBJECT( 'sensor_id', sensor_id, 'model_no', model_no, 'location', JSON_OBJECT( 'name', name, 'location', JSON_OBJECT( 'x', CAST(ST_X(location) AS SIGNED), 'y', CAST(ST_Y(location) AS SIGNED) ), 'radius', radius ) ) as JSON_output FROM sensors JOIN locations USING (location_id);https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=b17dfa3069b4bb9345a9e99e8b893121