我有一个有效的解决方案,但我想知道是否有人能想出更好的方法来获得相同的结果。
我有两个表,一个用于设备,另一个用于行。每个设备都可以插入0到4行。我正在运行的查询只是为了获取单个设备的行的设置。因此,我过滤设备表只返回一行。由于我需要在一行中获得结果,因此我使用GROUP_CONCAT
。
设备具有MAC地址,我正在过滤设备以获取该值。
Devices
表
+-------------+------------------+
| DeviceID | MACAddress |
+-------------+------------------+
| 900 | 'FFFFBBBB5555' |
+-------------+------------------+
Lines
表
+---------+-------------+-----------------+-------------------+
| LineID | DeviceID | LineNumber | Settings |
+---------+-------------+-----------------+-------------------+
| 100 | 900 | 1 | '{"scan":240, "enabled":true}'
| 101 | 900 | 3 | '{"scan":30, "enabled":false}'
+---------+-------------+-----------------+-------------------+
- 对不起表格布局,我不知道如何在starkoverflow.com中建立一个好的表格 :( -
我正在运行的查询是获取设备可以拥有的4条可能线路的线路设置。所以我总是需要4个设置,并用null填补空白。
SELECT
Devices.DeviceID,
CONCAT( '[', GROUP_CONCAT( IFNULL( Lines.Settings, 'null' ) ORDER BY pad.LineNumber ), ']' ) AS settings_json_array
FROM
Devices
LEFT JOIN (
SELECT 1 AS LineNumber
UNION SELECT 2 AS LineNumber
UNION SELECT 3 AS LineNumber
UNION SELECT 4 AS LineNumber
) pad
ON true
LEFT JOIN Lines
ON ( Lines.DeviceID = Devices.DeviceID AND Lines.LineNumber = pad.LineNumber )
WHERE
Devices.MACAddress='FFFFBBBB5555';
结果是一行
+------------+----------------------------------------------------------------------------------+
| DeviceID | settings_json_array |
+------------+----------------------------------------------------------------------------------+
| 900 | '[{"scan":240, "enabled":true},null,{"scan":30, "enabled":false},null]' |
+------------+----------------------------------------------------------------------------------+
我想摆脱丑陋的pad
虚拟桌
非常感谢你。