2013-02-18 4 views
0

Я знаю, что это может ввести в заблуждение, но, пожалуйста, несите меня на этом.mysql объединить два запроса на выбор

У меня есть два запроса SELECT с незначительной разницей, которая возвращает почти тот же набор результатов.

SELECT products_id,options_values_id 
    FROM products_attributes pa 
    LEFT JOIN products_options po ON (pa.options_id = po.products_options_id) 
    WHERE products_id ='574' and pa.options_id!=6 
    and pa.options_id!=3 
    AND products_options_type = 6 
    GROUP BY products_id,options_values_id 
    ORDER BY products_id,products_options_sort_order,options_id 

Второй запрос изменяется в products_options_type

SELECT products_id,options_values_id 
    FROM products_attributes pa 
    LEFT JOIN products_options po ON (pa.options_id = po.products_options_id) 
    WHERE products_id ='574' and pa.options_id!=6 
    and pa.options_id!=3 
    AND products_options_type = 2 
    GROUP BY products_id,options_values_id 
    ORDER BY products_id,products_options_sort_order,options_id 

И результаты, возвращаемые ими являются

574|193 
574|204 

И

574|25 
574|3 

Я хочу вывод как

574|193|25 
574|204|3 

Я попытался это:

SELECT pa.products_id,pa.options_values_id,ord.options_values_id 
     FROM products_attributes pa 
     LEFT JOIN products_options po ON (pa.options_id = po.products_options_id) 


     LEFT JOIN(SELECT products_id,options_values_id 
     FROM products_attributes pa 
     LEFT JOIN products_options po ON (pa.options_id = po.products_options_id) 
     WHERE products_id ='574' and pa.options_id!=6 
     and pa.options_id!=3 
     AND products_options_type = 2 
     GROUP BY products_id,options_values_id 
     ORDER BY products_id,products_options_sort_order,options_id)ord ON pa.products_id=ord.products_id 


     WHERE paproducts_id ='574' and pa.options_id!=6 
     and pa.options_id!=3 
     AND products_options_type = 2 
     GROUP BY pa.products_id,pa.options_values_id 
     ORDER BY pa.products_id,products_options_sort_order,options_id 

Однако это возвращает

574|193|25 
574|204|25 

Я не слишком хорошо с соединениями, так что любая идея, если и как это может быть сделано?

+1

Почему ваш движок базы данных знает, что 193 и 25 принадлежат вместе, как и 204 и 3? Я не мог этого знать, увидев ваш код. – Jens

+0

На самом деле логики там не так много, но я работаю над существующей системой, и мне нужен ярлык для этой части (просто не спрашивайте, зачем мне обманывать сюда). – Bluemagica

+0

Могу сказать, что у вас нет причин, по которым вам нужны ваши данные таким образом. Просто потому, что учение не способно сортировать данные, не зная, как это сделать. – Jens

ответ

0

Попробуйте

SELECT a.products_id,a.options_values_id, b.options_values_id 
FROM (SELECT @rownum:[email protected]+1 'rw', products_id, options_values_id 
FROM (SELECT @rownum:=0) r, products_attributes pa 
LEFT JOIN products_options po ON (pa.options_id = po.products_options_id) 
WHERE products_id ='574' and pa.options_id!=6 
and pa.options_id!=3 
AND products_options_type = 6 
GROUP BY products_id,options_values_id 
ORDER BY products_id,products_options_sort_order,options_id) a, 
(SELECT @rownum:[email protected]+1 'rw', products_id,options_values_id 
FROM (SELECT @rownum:=0) r, products_attributes pa 
LEFT JOIN products_options po ON (pa.options_id = po.products_options_id) 
WHERE products_id ='574' and pa.options_id!=6 
and pa.options_id!=3 
AND products_options_type = 2 
GROUP BY products_id,options_values_id 
ORDER BY products_id,products_options_sort_order,options_id) b 
WHERE a.products_id=b.products_id and a.rw=b.rw; 

Надеется, что это помогает.

+0

Спасибо, я смог изменить свой код на основе этого – Bluemagica

0

Try ниже запроса, вот я взял присоединиться на product_options дважды, 1 для po.products_options_type = 6 и 2 для po1.products_options_type = 2

SELECT pa.products_id,po.options_values_id,po1.options_values_id 
FROM products_attributes pa 
LEFT JOIN products_options po ON (pa.options_id = po.products_options_id and po.products_options_type = 6) 
LEFT JOIN products_options po1 ON (pa.options_id = po1.products_options_id and po.products_options_type = 2) 
WHERE pa.products_id ='574' and pa.options_id!=6 
and pa.options_id!=3 
GROUP BY products_id,po1.options_values_id,po1.options_values_id 
ORDER BY products_id,products_options_sort_order,options_id 
0

Альтернативное решение:

select v1,v2,v3, v4 from (SELECT products_id v1,options_values_id v2 
    FROM products_attributes pa 
    LEFT JOIN products_options po ON (pa.options_id = po.products_options_id) 
    WHERE products_id ='574' and pa.options_id!=6 
    and pa.options_id!=3 
    AND products_options_type = 6 
    GROUP BY products_id,options_values_id 
    ORDER BY products_id,products_options_sort_order,options_id) t1,  
(SELECT products_id v3,options_values_i v4 
    FROM products_attributes pa 
    LEFT JOIN products_options po ON (pa.options_id = po.products_options_id) 
    WHERE products_id ='574' and pa.options_id!=6 
    and pa.options_id!=3 
    AND products_options_type = 2 
    GROUP BY products_id,options_values_id 
    ORDER BY products_id,products_options_sort_order,options_id) t2 
where t1.products_id=t2.products_id 

Вы можете сортировать его легко.

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