我正在尝试解决(一个复杂的?)问题,但我自己无法解决这个问题。
我得到了以下表格:(坐标是虚拟的)
表A:
ID | Name |Attribute 1 | Attribute 2 | Lat | Lon | Car Country
1 | Test 1 | Blue | BMW | 6.4 | 6.2 | German
2 | Hallo | Red |Porsche | 6.4 |6.2 | German
3 | Miau | Silver |Ferrari | 2.5 | 1.4 | Italy
表B
ID |ID Car| Slot | Path
1 | 1 | 1 |jsjf.jpg
2 | 2 | 1 | hkfu.jpg
3 | 2 | 2 | eqfwg.png
用户可以上传带有属性和坐标以及无限图片的汽车。然后,图片连同路径、槽位(第一张图像、第二张图像……)及其所属的汽车一起保存在表 B 中。
所以现在我想要获取我半径内的每辆车和前 3 张图像。作为我需要的坐标 6.4&6.2 的结果:
ID | Name | Attribute 1 | Attribute 2 | image1 | image2 |image3
1 | Test 1 | Blue | BMW | jsjf.jpg | Null | Null
2 | Hallo | Red | Porsche | hkfu.jpg | eqfwg.png | Null
我目前的查询是:
SELECT
a.id,
a.name,
a.attribute1,
a.attribute2,
MAX(CASE WHEN b.slot= 1 THEN b.path ELSE NULL END) image1,
MAX(CASE WHEN b.slot= 2 THEN b.path ELSE NULL END) image2,
MAX(CASE WHEN b.slot= 3 THEN b.path ELSE NULL END) image3,
(
6371 * acos(
cos(
radians( 6.4 )
) * cos(
radians( lat )
) * cos(
radians( lon ) - radians( 6.2 )
) + sin(
radians( 6.4 )
) * sin(
radians( lat )
)
)
) AS distance
FROM
a
left join bon a.id=b.idcar
WHERE carcountry= 'German'
HAVING
distance <= 50
ORDER BY
distance asc LIMIT 0, 10
没有 Max() 并加入一切正常......
最佳答案
你无法通过聚合来解决这个问题。您可以执行多个左连接,每个图像一个,包括连接的 ON
中的 slot = n
子句,因此:
SELECT (...), image1.file as image1, image2.file as image2, (...)
FROM
a
LEFT JOIN image image1 ON slot=1 AND a.id=image1.idcar
LEFT JOIN image image2 ON slot=2 AND a.id=image2.idcar
当然,将slot
与外键一起包含在索引中会很有帮助。此外,简单地查询所有图像并在应用程序逻辑中重组数据可能会更有效;左连接往往很昂贵。我建议花一些时间来衡量这一点。
我认为它也可以通过在子查询上进行子选择的联接来解决,但我不会这样做,因为它往往不会更有效,而且会降低您的可读性。
关于mysql - 使用许多 where 和having 子句将多行连接为列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35998680/