mysql - 使用许多 where 和having 子句将多行连接为列

标签 mysql join

我正在尝试解决(一个复杂的?)问题,但我自己无法解决这个问题。

我得到了以下表格:(坐标是虚拟的)

表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/

相关文章:

php - 拥有一个应该在 Laravel 中存储单个记录或行的数据库表

mysql - 三个表连接和计数显示错误结果

python - 合并具有非唯一索引的多个数据帧

php - 我们如何从 mysql 数据库中的表中获取不匹配的值

php - 选择按天分组的命中,包括命中数为 0 的天数

python - MySQL 查询 - 选择具有 2 个特定 DISTINCT 列值的 2 行

mysql - 如何从POSTMAN客户端将数据发布到表中

mysql - 进行 LEFT JOIN 时,当第二个表中不存在匹配值时,匹配值将从结果中丢失

php - MySQL 查询执行需要时间处理单个大表?

php - 在 MySQL 中获取更新值而不是受影响的行