MySQL 子查询不工作(逻辑错误)
MySQL subquery not working (bad logical)
请问,您可以查看此查询吗?我无法使用子查询检索正确的值。我相信我的逻辑是不正确的。
我日复一日地努力使这项工作成功,但没有成功。
SQLfiddle 中的 SQL 查询上方有重现错误的注释。
有了这个sketch你可以更好的了解我需要什么
SELECT P.nome, centroide_produto_id, similar_produto_id,
(SELECT preco_venda FROM precos A
WHERE A.produto_id=CL.similar_produto_id
AND A.preco_id = (
SELECT Max(preco_id) FROM precos A2, cluster_copy3 CL2 WHERE A2.produto_id=A.produto_id AND A2.produto_id=CL2.similar_produto_id
AND A2.preco_venda = (SELECT Max(preco_venda) FROM precos A3, cluster_copy3 CL3 WHERE A3.produto_id=CL3.similar_produto_id AND CL3.centroide_produto_id=CL.centroide_produto_id)
)
) AS preco_maximo
FROM produtos P, cluster_copy3 CL
WHERE P.produto_id=CL.centroide_produto_id
AND CL.centroide_produto_id IN (9817, 9816)
#GROUP BY CL.centroide_produto_id
preco_maximo = null 是你的问题吗?
添加此条件应该可以解决此问题
AND CL.similar_produto_id != CL.centroide_produto_id
列出您的预期结果会有所帮助。如果你真的在寻找 max(preco_id) 和 max(preco_venda),那么它可能是这样的:
SELECT p.nome, c.centroide_produto_id, c.similar_produto_id
,x.max_preco_id
,x.preco_maximo
FROM produtos p
JOIN cluster_copy3 c ON (p.produto_id = c.centroide_produto_id AND
c.centroide_produto_id IN (9817, 9816)
)
JOIN (SELECT produto_id
,MAX(preco_id) max_preco_id
,MAX(preco_venda) preco_maximo
FROM precos
GROUP BY produto_id) x ON (x.produto_id = p.produto_id)
输出:
| nome | centroide_produto_id | similar_produto_id | max_preco_id | preco_maximo |
|------------------------------------------------|----------------------|--------------------|--------------|--------------|
| My NY EDT Feminino 30ml | 9816 | 9816 | 31438 | 169 |
| My NY EDT Feminino 30ml | 9816 | 9819 | 31438 | 169 |
| Flower By Kenzo EDP Recarregável Feminino 30ml | 9817 | 9817 | 31455 | 149 |
| Flower By Kenzo EDP Recarregável Feminino 30ml | 9817 | 9830 | 31455 | 149 |
如果您正在寻找 max(preco_venda) 和关联的 preco_id,那么可能是这样的:
SELECT p.nome, c.centroide_produto_id, c.similar_produto_id
,y.preco_id
,y.preco_maximo
FROM produtos p
JOIN cluster_copy3 c ON (p.produto_id = c.centroide_produto_id AND
c.centroide_produto_id IN (9817, 9816)
)
JOIN (
SELECT x.produto_id, x.preco_maximo, MAX(p.preco_id) preco_id
FROM precos p
JOIN (SELECT produto_id
,MAX(preco_venda) preco_maximo
FROM precos
GROUP BY produto_id
) x ON (x.produto_id = p.produto_id AND
x.preco_maximo = p.preco_venda)
GROUP BY x.produto_id, x.preco_maximo
) y ON (y.produto_id = p.produto_id)
输出:
| nome | centroide_produto_id | similar_produto_id | preco_id | preco_maximo |
|------------------------------------------------|----------------------|--------------------|----------|--------------|
| My NY EDT Feminino 30ml | 9816 | 9816 | 31438 | 169 |
| My NY EDT Feminino 30ml | 9816 | 9819 | 31438 | 169 |
| Flower By Kenzo EDP Recarregável Feminino 30ml | 9817 | 9817 | 31455 | 149 |
| Flower By Kenzo EDP Recarregável Feminino 30ml | 9817 | 9830 | 31455 | 149 |
虽然输出是一样的,但返回的不是集群的最大id,而是与最大preco相关联的id。
更新 1:
再一次,我猜你在找什么。看起来您只需要结果中的两行。对于每个感兴趣的产品,找到其所有相关产品的最新价格(如 precos 中所定义),然后取这些最新价格中的最高价格:
SELECT x.nome, x.centroide_produto_id, MAX(p2.preco_venda) AS venda_maximo
FROM (SELECT p.nome, c.centroide_produto_id, c.similar_produto_id, MAX(pr.preco_id) AS max_preco_id
FROM produtos p
JOIN cluster_copy3 c ON (p.produto_id = c.centroide_produto_id)
JOIN precos pr ON (pr.produto_id = c.similar_produto_id)
WHERE p.produto_id IN (9817, 9816)
GROUP BY p.nome, c.centroide_produto_id, c.similar_produto_id
) x
JOIN precos p2 ON (p2.preco_id = x.max_preco_id)
GROUP BY x.nome, x.centroide_produto_id
ORDER BY x.centroide_produto_id
输出:
| nome | centroide_produto_id | venda_maximo |
|------------------------------------------------|----------------------|--------------|
| My NY EDT Feminino 30ml | 9816 | 243 |
| Flower By Kenzo EDP Recarregável Feminino 30ml | 9817 | 149 |
请问,您可以查看此查询吗?我无法使用子查询检索正确的值。我相信我的逻辑是不正确的。
我日复一日地努力使这项工作成功,但没有成功。
SQLfiddle 中的 SQL 查询上方有重现错误的注释。
有了这个sketch你可以更好的了解我需要什么
SELECT P.nome, centroide_produto_id, similar_produto_id,
(SELECT preco_venda FROM precos A
WHERE A.produto_id=CL.similar_produto_id
AND A.preco_id = (
SELECT Max(preco_id) FROM precos A2, cluster_copy3 CL2 WHERE A2.produto_id=A.produto_id AND A2.produto_id=CL2.similar_produto_id
AND A2.preco_venda = (SELECT Max(preco_venda) FROM precos A3, cluster_copy3 CL3 WHERE A3.produto_id=CL3.similar_produto_id AND CL3.centroide_produto_id=CL.centroide_produto_id)
)
) AS preco_maximo
FROM produtos P, cluster_copy3 CL
WHERE P.produto_id=CL.centroide_produto_id
AND CL.centroide_produto_id IN (9817, 9816)
#GROUP BY CL.centroide_produto_id
preco_maximo = null 是你的问题吗? 添加此条件应该可以解决此问题
AND CL.similar_produto_id != CL.centroide_produto_id
列出您的预期结果会有所帮助。如果你真的在寻找 max(preco_id) 和 max(preco_venda),那么它可能是这样的:
SELECT p.nome, c.centroide_produto_id, c.similar_produto_id
,x.max_preco_id
,x.preco_maximo
FROM produtos p
JOIN cluster_copy3 c ON (p.produto_id = c.centroide_produto_id AND
c.centroide_produto_id IN (9817, 9816)
)
JOIN (SELECT produto_id
,MAX(preco_id) max_preco_id
,MAX(preco_venda) preco_maximo
FROM precos
GROUP BY produto_id) x ON (x.produto_id = p.produto_id)
输出:
| nome | centroide_produto_id | similar_produto_id | max_preco_id | preco_maximo |
|------------------------------------------------|----------------------|--------------------|--------------|--------------|
| My NY EDT Feminino 30ml | 9816 | 9816 | 31438 | 169 |
| My NY EDT Feminino 30ml | 9816 | 9819 | 31438 | 169 |
| Flower By Kenzo EDP Recarregável Feminino 30ml | 9817 | 9817 | 31455 | 149 |
| Flower By Kenzo EDP Recarregável Feminino 30ml | 9817 | 9830 | 31455 | 149 |
如果您正在寻找 max(preco_venda) 和关联的 preco_id,那么可能是这样的:
SELECT p.nome, c.centroide_produto_id, c.similar_produto_id
,y.preco_id
,y.preco_maximo
FROM produtos p
JOIN cluster_copy3 c ON (p.produto_id = c.centroide_produto_id AND
c.centroide_produto_id IN (9817, 9816)
)
JOIN (
SELECT x.produto_id, x.preco_maximo, MAX(p.preco_id) preco_id
FROM precos p
JOIN (SELECT produto_id
,MAX(preco_venda) preco_maximo
FROM precos
GROUP BY produto_id
) x ON (x.produto_id = p.produto_id AND
x.preco_maximo = p.preco_venda)
GROUP BY x.produto_id, x.preco_maximo
) y ON (y.produto_id = p.produto_id)
输出:
| nome | centroide_produto_id | similar_produto_id | preco_id | preco_maximo |
|------------------------------------------------|----------------------|--------------------|----------|--------------|
| My NY EDT Feminino 30ml | 9816 | 9816 | 31438 | 169 |
| My NY EDT Feminino 30ml | 9816 | 9819 | 31438 | 169 |
| Flower By Kenzo EDP Recarregável Feminino 30ml | 9817 | 9817 | 31455 | 149 |
| Flower By Kenzo EDP Recarregável Feminino 30ml | 9817 | 9830 | 31455 | 149 |
虽然输出是一样的,但返回的不是集群的最大id,而是与最大preco相关联的id。
更新 1:
再一次,我猜你在找什么。看起来您只需要结果中的两行。对于每个感兴趣的产品,找到其所有相关产品的最新价格(如 precos 中所定义),然后取这些最新价格中的最高价格:
SELECT x.nome, x.centroide_produto_id, MAX(p2.preco_venda) AS venda_maximo
FROM (SELECT p.nome, c.centroide_produto_id, c.similar_produto_id, MAX(pr.preco_id) AS max_preco_id
FROM produtos p
JOIN cluster_copy3 c ON (p.produto_id = c.centroide_produto_id)
JOIN precos pr ON (pr.produto_id = c.similar_produto_id)
WHERE p.produto_id IN (9817, 9816)
GROUP BY p.nome, c.centroide_produto_id, c.similar_produto_id
) x
JOIN precos p2 ON (p2.preco_id = x.max_preco_id)
GROUP BY x.nome, x.centroide_produto_id
ORDER BY x.centroide_produto_id
输出:
| nome | centroide_produto_id | venda_maximo |
|------------------------------------------------|----------------------|--------------|
| My NY EDT Feminino 30ml | 9816 | 243 |
| Flower By Kenzo EDP Recarregável Feminino 30ml | 9817 | 149 |