СОСТАВИТЬ информацию из одного стола в СОЮЗ двух других ... Возможно ли это? - PullRequest
1 голос
/ 20 августа 2011

То, что я хочу сделать, выглядит примерно так:

SELECT *  
FROM products as p, cat_index1 as c1, cat_index_2 as c2  
WHERE p.pid = c1.cid OR p.pid = c2.cid

не то чтобы я ожидал, что это сработает, но EXPLAIN выдает следующую ошибку:

Impossible WHERE noticed after reading const table...

У меня есть список продуктов и таблица для каждой категории, я хотел бы получать информацию из более чем одной категории одновременно и объединять ее с информацией о продукте. Товары в таблице товаров могут быть в обеих категориях, в одной категории или ни в одной. Вывод должен быть объединением cat_index1 с cat_index2, и я хочу объединить информацию о продуктах с указанным объединением.

Таблица продуктов довольно большая, там много информации, но таблицы категорий представляют собой один столбец, содержащий только идентификаторы продуктов членов указанной категории, которые, конечно, равны столбцу идентификаторов в таблице продуктов. В настоящее время внешние ключи не установлены.

У кого-нибудь есть идеи?

Ответы [ 4 ]

3 голосов
/ 20 августа 2011
SELECT *  
FROM products as p
inner join cat_index1 as c1 on (p.pid = c1.cid)

union

SELECT *  
FROM products as p
inner join cat_index2 as c2 on (p.pid = c2.cid)
2 голосов
/ 20 августа 2011

На основании результатов, которые вы описали, вы хотите, я думаю, что вы на самом деле ищете OUTER JOIN.Попробуйте это:

SELECT * FROM products
    LEFT OUTER JOIN cat_index1 as c1 ON c1.cid = p.pid
    LEFT OUTER JOIN cat_index2 as c2 ON c2.cid = p.pid

Этот запрос вернет все продуктов и связанных с ними записей в cat_index1 и cat_index2.Если в cat_index1 или cat_index2 не найдено ни одной подходящей записи, строка результатов будет включена в ваш набор результатов.

1 голос
/ 20 августа 2011

Попробуйте использовать

SELECT *  
FROM products as p
where 
EXISTS(select * from cat_index1 as c1 where p.pid = c1.cid) or  EXISTS(select * cat_index_2 as c2  
WHERE p.pid = c2.cid)
1 голос
/ 20 августа 2011

Попробуйте использовать WHERE IN () и union cat_index1.cid и cat_index_2.cid:

SELECT * FROM Products AS P WHERE P.pid IN
(
SELECT cat_index1.cid
 UNION 
SELECT cat_index_2.cid
)
...