我有两张桌子:
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 price.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;
答案 0 :(得分:0)
叫我老式,但我真的不喜欢存储json数据。无论如何,规范化的表可能看起来像这样......
Prices
+----------+------------+-------+
| reseller | bouquet_id | price |
+----------+------------+-------+
| 1 | 1 | 1.11 |
| 1 | 4 | 4.44 |
| 1 | 5 | 5.55 |
+----------+------------+-------+
答案 1 :(得分:0)
这在纯粹的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
部分
答案 2 :(得分:0)
我使用mysql包装器在节点js中进行编程这是我使用的解决方案,它正在工作:
/* QUERY - aaBouquets */
connection.query("SELECT id, bouquet FROM bouquets ORDER BY bouquet ASC",function(err, rows, fields){
/* BOUQUETS - number */
var total = rows.length;
/* FOUND - bouquets */
if (rows.length) {
/* GET - prices */
for (var i in rows) {
var s = 1;
connection.query("SELECT '"+rows[i].id+"' AS id, '"+rows[i].bouquet+"' AS bouquet FROM prices p LEFT JOIN bouquets b ON JSON_SEARCH(p.price, 'one', '$.\""+rows[i].id+"\"') WHERE p.reseller=? AND FORMAT(JSON_EXTRACT(price, '$.\""+rows[i].id+"\"'), 2) != \"0.00\"",[qreseller], function(err, rows, results){
/* CHECK - prices */
if (s < total) {
if (rows.length) {
/* GET - prices */
data.push(rows[0]);
};
s++;
} else {
/* CHECK - prices */
if(data.length) {
if (rows.length) {
/* GET - prices */
data.push(rows[0]);
};
/* RETURN - servers data */
res.json(data);
};
}
});
}
}
});
你可以看到第一个查询正在获取id和花束名称然后在for循环中我使用该id来获取该花束id的值并仅在值不等于&#34; 0.00&#34; ...使用时显示变量s和total在这里使用,因为如果我调用console.log(数据)我得到未定义的变量。因为在节点js变量是本地的,需要在for循环中调用如果在外部调用我得到未定义的变量错误。
这样我只得到定价的花束......我不知道是否可以在单个查询中完成(因为你不能在p.prices上使用LEFT JOIN ON b.id )所以需要这两个查询...对我来说它已经好了...所以如果有人可以最小化代码以使其更快或改进...欢迎。