2015-08-11 2 views
0

Просьба пересмотреть этот вопрос? Я не могу извлечь правильные значения в подзапрос. Я считаю, что моя логика неверна.Подзапрос MySQL не работает (плохой логический)

Я пытаюсь сделать эту работу изо дня в день, но без succcess.

Над запросом SQL в SQLfiddle есть комментарии, чтобы воспроизвести ошибку.

С этим 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 
+0

Это помогло бы, если бы мы знали, что вы пытаетесь сделать. Образцы данных и желаемые результаты всегда полезны. –

+0

Привет, Гордон! Желаемые значения объясняются в sqlfiddle, как только здесь я не могу показать строки таблицы. – Ailton

+0

Кто-нибудь, пожалуйста? С эскизом [this] (http://sencial.me/images/esquema_sql_preco.gif) вы можете лучше понять, что мне нужно. – Ailton

ответ

0

Листинг ваши ожидаемые результаты могли бы помочь. Если вы действительно ищете макс (preco_id) и макс (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 | 

Если вы ищете макс (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 возвращаемого кластера, а идентификатор, связанный с max preco.

Update 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 | 
+0

Привет Гленн! Спасибо за ваше предложение, но возвращенные цены неверны. Пожалуйста, см. Этот [эскиз] [2], что вы можете лучше понять, что мне нужно. – Ailton

+0

@Ailton Многие люди были бы рады помочь, но по-прежнему очень сложно понять, что вы хотите видеть. Я посмотрел на вашу диаграмму, и я вижу, что вы ищете «последнее», а не «max», но я все еще не понимаю желаемого окончательного результата. Добавьте к своему вопросу таблицу, немного в формате вывода в моем ответе, в котором показаны точно строки и столбцы, которые вы ожидаете увидеть, возвращенные из вашего запроса.Вы хотите увидеть эти 4 строки с этими 4 столбцами? Какую ценность вы ожидаете в каждой позиции. Тогда ваша диаграмма может помочь объяснить причину. – Glenn

+0

Привет, Гленн! Пожалуйста, ознакомьтесь с этим новым [sqlfiddle] (http://sqlfiddle.com/#!9/ad7b2/9) с этим новым [эскизом] (http://sencial.me/images/esquema_sql_preco.gif) – Ailton

0

preco_maximo = null ваша проблема? Добавление этого условия должны решить эту

AND CL.similar_produto_id != CL.centroide_produto_id 
+0

Привет! Нет, нулевое значение ожидается, как только мне понадобится только 1 значение на centroide_produto_id. Проблема в том, что preco_maximo 299 неверен, потому что мне нужен max (preco_id) - 31490 или 31455 с max (preco_venda), который равен 149 в centroide_produto_id 9817 – Ailton

Смежные вопросы