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 |