2012-07-03 1 views
1

Я присоединяюсь к двум ВЫБОРЫ. Первый из них получает:MySQL-Left Join показывает больше строк, чем ожидалось

t1 
id value 
1 149 
2 149 
3 149 
4 149 

второй один:

t2 
id value 
149 2 
149 13 
149 145 
149 149 

Итак, я присоединяюсь t1/t2 на t1.value = t2.id. Но результат следующим образом:

1 149 2 
1 149 13 
1 149 145 
1 149 149 
2 149 2 
2 149 13 
2 149 145 
2 149 149 
3 149 2 
3 149 13 
3 149 145 
3 149 149 
4 149 2 
4 149 13 
4 149 145 
4 149 149 

Когда желаемый результат должен выглядеть следующим образом:

1 149 2 
2 149 13 
3 149 145 
4 149 149 

Я думаю, что проблема возникает из-за этого являются ВЫБРАТЬ и не таблицы. После многопользовательской игры я не смог найти решения.

EDIT: MySQL запросов:

SELECT t1.id_sequence,t2.id_category, t2.tree 
FROM 
(
    SELECT * FROM (SELECT 1 AS id_sequence UNION SELECT 2 AS id_sequence UNION SELECT 3 AS id_sequence UNION SELECT 4 AS id_sequence) as tbl1 
    CROSS JOIN (SELECT DISTINCT id_catalog_category AS 'id_category' from catalog_category where id_catalog_category = 149) as tbl2 
) as t1 
LEFT JOIN 
(
    SELECT child.id_catalog_category AS id_category, ancestor.id_catalog_category AS tree 
    FROM catalog_category AS child 
    JOIN catalog_category AS ancestor 
    ON (child.lft BETWEEN ancestor.lft AND ancestor.rgt) 
    WHERE child.id_catalog_category = 149 AND ancestor.id_catalog_category != 1 
) as t2 
ON t1.id_category = t2.id_category 

Выберите извлекаться table1 и таблица2 соответственно.

+2

Пожалуйста, разместите ваш запрос и структуры таблиц – FabioCosta

ответ

0

Mysql объединяет ROWS на основе VALUES, который отличается от соединения только с VALUES.

В вашем наборе данных должно быть возвращено 4 * 4 строки, что и есть то, что вы получаете, поэтому никаких проблем с вашим запросом не возникает. Ваши ожидания ошибочны.

Например:

первая строка t1: 1 149 вы можете сами убедиться, что ваш присоединиться матчи все строки t2, так что 4 строки возвращаются. Это одинаково для всех следующих строк t1, которые в общей сложности возвращают 16 из них.

EDIT: проверить это:

SELECT @rownum:[email protected]+1 as `id`, t2.* 
FROM (
    SELECT child.id_catalog_category AS id_category, ancestor.id_catalog_category AS tree 
    FROM catalog_category AS child 
    JOIN catalog_category AS ancestor 
    ON (child.lft BETWEEN ancestor.lft AND ancestor.rgt) 
    WHERE child.id_catalog_category = 149 AND ancestor.id_catalog_category != 1 
) as t2 
+0

Вы полностью правы @Sebas. Глупая ошибка. Ну, мой вопрос продолжается. Как я могу получить желаемую таблицу? – Cristobal

+0

Я не уверен в вашем использовании «таблицы». Вы хотите изменить свою структуру или изменить свой запрос, чтобы получить желаемый результат? – Sebas

+0

Я построил индексную последовательность из первого выбора, затем появился идентификатор продукта и, наконец, некоторые значения продукта. Я хочу, чтобы запрос получил итоговую таблицу по вопросу. Как вы сказали, мой запрос выполняет запрос 1 *, и мне нужен результат 1-1 – Cristobal

0

Я думаю, что ваш текущий результат является правильным. В качестве примера, Предположим, что id в t1 уникально идентифицирует человека. & Значение - это магазин Walmart, на котором он совершает покупки. Предположим, что id в t2 является хранилищем Walmart #, значение - это список номеров элементов всего в каждом магазине Walmart.

Следовательно, каждый человек может купить все от магазина Walmart # 149. Заключение - Что вы действительно пытаетесь сделать?