我有两个表:
Bouquets
+----+------------+
| id | bouquet |
+----+------------+
| 1 | Package #1 |
| 2 | Package #2 |
| 3 | Package #3 |
| 4 | Package #4 |
| 5 | Package #5 |
+----+------------+
和
Prices
+----+----------+-------------------------------------------------------------------+
| id | reseller | price
+----+----------+-------------------------------------------------------------------+
| 1 | 1 | {"1": "1.11", "2": "0.00", "3": "0.00", "4": "4.44", "5": "5.55"} |
+----+----------+-------------------------------------------------------------------+
我需要获取价格值不是“0.00”的花束名称...所以我尝试使用 LEFT JOIN 加入 bouquets.id ON prices.price 但我无法获取如何?
我需要得到这个:
+----+------------+
| id | bouquet |
+----+------------+
| 1 | Package #1 |
| 4 | Package #4 |
| 5 | Package #5 |
+----+------------+
这是我的尝试,但我得到的结果是空的:
SELECT b.id, b.bouquet FROM bouquets b
LEFT JOIN prices p ON JSON_CONTAINS(p.price, CAST(b.id as JSON), '$') != "0.00"
WHERE p.reseller=1;
最佳答案
这看起来并不容易完全在 mysql 中完成,最好的想法是使用(PHP、ASP 等)来完成繁重的工作,但经过大量的反复试验后,我发现了这篇文章:
Convert JSON array in MySQL to rows
从那里这个查询似乎对我有用
SELECT
b.id,
b.bouquet
FROM bouquet AS b
JOIN (
SELECT
indx.id,
indx.idx,
JSON_EXTRACT(p.price, idx) AS bouquetprice
FROM prices AS p
JOIN (
SELECT '$."1"' AS idx, 1 AS id UNION
SELECT '$."2"' AS idx, 2 AS id UNION
SELECT '$."3"' AS idx, 3 AS id UNION
SELECT '$."4"' AS idx, 4 AS id UNION
SELECT '$."5"' AS idx, 5 AS id
) AS indx
WHERE JSON_EXTRACT(p.price, idx) IS NOT NULL
AND p.reseller = 1
) AS ind
ON b.id = ind.id
AND ind.bouquetprice != "0.00"
技巧似乎是链接的 SO 帖子中的 CONCAT 不适用于您的 json 中的数字键名称。所以你必须求助于临时连接中的 2 个索引来搜索。
此外,临时连接表在创建不断增长的索引列表方面不太理想,但它至少是一个开始的地方。 (抱歉所有错误的命名 idx、indx 等)
编辑:忘记了 reseller
部分
关于MySQL LEFT JOIN json 字段与表中的另一个 id,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44002941/