MySQL Join проблемы - PullRequest
       4

MySQL Join проблемы

0 голосов
/ 26 февраля 2011

Редактировать 2:
Ничего здесь не найти, моя неудача в другом месте.
Кто знал, что != NULL не работает в MySQL.
Модератор удалите это пожалуйста?

У меня есть eav база данных, в которой мне нужно выбрать некоторые продукты с атрибутами.
Когда я использую

select attribute1.value as a1, attribute2.value as a2, products.id
from attributes attribute1, attributes attribute2, products
where product.id = attribute1.product_id and attribute1.name = 'abc' and
    product.id = attribute2.product_id and attribute2.name = 'def'

Я не получаю все товары, если для одного товара отсутствует атрибут, и мне нужно получить все товары с помощью NULL, если отсутствуют атрибуты.
Когда я использую

select attribute1.value as a1, attribute2.value as a2, products.id
from products
left join attributes as attribute1 on (product.id = attribute1.product_id and attribute1.name = 'abc')
left join attributes as attribute2 on (product.id = attribute2.product_id and attribute2.name = 'def')

Я получаю все продукты, но у всех продуктов есть a1 = NULL, даже если они отсутствуют в базе данных.
В чем проблема?

* * 1 022 Пример: * 1 023 *

продукты:

 id
1000
1001
1002
1003

атрибуты:

name    product_id    value
abc        1000         1
abc        1002         2
def        1000         3
def        1001         4

Ожидаемый результат:

 id     a1      a2
1000    1       3
1001   NULL     4
1002    2      NULL
1003   NULL    NULL

Результат первого запроса:

 id     a1      a2
1000    1       3

Результат второго запроса:

 id     a1      a2
1000   NULL     3
1001   NULL     4
1002   NULL    NULL
1003   NULL    NULL

EDIT:

Исправлен второй запрос и пример.

Ответы [ 3 ]

1 голос
/ 26 февраля 2011

Пара вопросов:

  1. Отсутствует предложение from, чтобы начать запрос
  2. Вам необходимо использовать правильные псевдонимы таблиц для тестов attribute.name, в частности attribute1.name и attribute2.name.

Попробуйте это так:

select attribute1.value as a1, attribute2.value as a2, products.id
    from products
        left join attributes as attribute1 
            on products.id = attribute1.product_id 
                and attribute1.name = 'abc'
        left join attributes as attribute2 
            on products.id = attribute2.product_id 
                and attribute2.name = 'def'
0 голосов
/ 26 февраля 2011

Для того, чтобы это работало, вы должны заменить первый JOIN на FROM, например:

SELECT attribute1.value AS a1, attribute2.value AS a2, products.id
FROM attributes AS attribute1 ON (product.id = attribute1.product_id AND attribute.name = 'abc')
LEFT JOIN attributes AS attribute2 ON (product.id = attribute2.product_id AND attribute.name = 'def')
0 голосов
/ 26 февраля 2011

Запрос

select attribute1.value as a1, attribute2.value as a2, products.id
left join attributes as attribute1 on (product.id = attribute1.product_id and attribute.name = 'abc')
left join attributes as attribute2 on (product.id = attribute2.product_id and attribute.name = 'def')

Не правильно, где таблица с продуктами?

А также что такое attribute.name, у вас нет таблицы с атрибутом name / alias

...