2013-07-10 4 views
-1

мой запрос выглядит следующим образом:Mysql INNER JOIN сомневается

SELECT * FROM order_main t 
    LEFT JOIN order_pos op ON t.id=op.order_main_id 
    LEFT JOIN order_product oprod ON op.id=oprod.order_pos_id 
    LEFT JOIN product pr ON pr.id=oprod.product_id 
    INNER JOIN(
       SELECT t.id, MAX(pr.hours) as HoursMax FROM order_main t 
       LEFT JOIN order_pos op ON t.id=op.order_main_id 
       LEFT JOIN order_product oprod ON op.id=oprod.order_pos_id 
       LEFT JOIN product pr ON pr.id=oprod.product_id 
       WHERE (t.created <= '2013-07-01' AND t.status >= 1 AND t.status < 3 AND pr.hours IS NOT NULL) 
        OR (t.created > '2013-07-01' AND t.payed = 1 AND t.report_sended = 0 AND pr.hours IS NOT NULL) GROUP BY t.id 
      ) grouptt ON t.id = grouptt.id 
WHERE (t.created <= '2013-07-01' AND t.status >= 1 AND t.status < 3 AND pr.hours IS NOT NULL AND DATE_SUB(NOW(), INTERVAL grouptt.HoursMax HOUR) > t.created) 
     OR (t.created > '2013-07-01' AND t.payed = 1 AND t.report_sended = 0 AND pr.hours IS NOT NULL AND DATE_SUB(NOW(), INTERVAL grouptt.HoursMax HOUR) > t.created) 

Есть ли способ обойтись без INNER JOIN?

UPDATE:

Я пытаюсь выбрать все заказы, которые в последнее время.

У меня есть часы в моем столе, как вы можете видеть, мне нужно найти все позиции (order_pos) порядка (order_main), и от них мне нужно найти отношения (order_product), и только после этого я могу найти часы своего продукта (продукт). Но позиции с продуктами могут быть несколько для каждого заказа. И мне нужно найти часы MAX.

Когда я нахожу часы MAX по каждому заказу (теперь я делаю это с INNER JOIN), я могу сравнить это с датой создания заказа (t.created).

Я думаю, что этот запрос sql очень сложный. Кажется, я могу сделать это проще?

Благодаря

+1

Было бы лучше, если бы вы могли объяснить, чего вы пытаетесь достичь, а не просто бросать кусок кода в публику. – gaborsch

+0

Зачем вам это нужно, чтобы не быть внутренним соединением? Какую поведенческую или производительность вы пытаетесь решить? – MatBailie

+0

Извините ... обновил мое сообщение с информацией ..... – sandra1n

ответ

0

Как вам нужны только поля из order_main, вы можете по крайней мере, избавиться от стыки и условия во внешнем запросе (и использовать только внутренние соединения):

SELECT * FROM order_main om 
INNER JOIN 
    (SELECT t.id, t.created 
    FROM order_main t 
    INNER JOIN order_pos op ON t.id = op.order_main_id 
    INNER JOIN order_product oprod ON op.id = oprod.order_pos_id 
    INNER JOIN product pr ON pr.id = oprod.product_id 
    WHERE (t.created <= '2013-07-01' AND t.status IN (1,2)) 
    OR (t.created > '2013-07-01' AND t.payed = 1 AND t.report_sended = 0) 
    GROUP BY t.id 
    HAVING DATE_ADD(t.created, INTERVAL MAX(pr.hours) HOUR) < NOW()) AS grouptt 
ON om.id = grouptt.id