2012-04-03 3 views
1

Я пытаюсь запустить программу, чтобы проверить, действительны ли ваучеры в таблице ваучеров.Условное внутреннее соединение на основе содержимого первичной таблицы

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

Итак, у меня есть таблица ваучеров

id |  brand  |  supplier | value etc 

таблица брендов

id  |  name  etc 

и таблица поставщиков

id  |  name  etc 

Если ваучер не является специфической для марки или поставщиком, то значение в таблице ваучеров составляет 0

Я пробовал этот запрос Sql, соединяющий внутренние таблицы, но я не получаю никаких результатов, я предполагаю, что это потому, что код ваучера (id), который я пытаюсь использовать, не специфичен для бренда или поставщика?

SELECT *, brands.name as brandName, suppliers.name as supplierName 
    FROM `vouchers` 
    INNER JOIN brands on vouchers.brand = brands.id 
    INNER JOIN suppliers on vouchers.supplier = suppliers.id 
    WHERE vouchers.id= '" & voucherCode & "' 

Как бы я пишу это так, что присоединение таблицы brands обусловливается значением brand в таблице vouchers больше, чем 0 (а затем simiarly для поставщиков)

Я имел взгляд здесь и см. несколько других вопросов, но я боюсь, что не полностью понимаю ответы на вопрос, могу ли я связать их с моей ситуацией.

Использование базы данных MySQL, кстати :-)

+0

Зачем вам делать условное соединение? Используйте 'LEFT JOIN' вместо' INNER JOIN'. Если вы получаете нулевые записи, это означает, что для конкретной записи не найдены результаты. Затем примените логику в своем приложении, если не null - бренды были найдены, если null - нет брендов. Не используйте логику на уровне базы данных. –

+0

В ответ на это просто потому, что я мусор с Sql !! –

ответ

1

Почему вы не просто делать LEFT JOIN вместо так:

SELECT *, brands.name as brandName, suppliers.name as supplierName 
    FROM `vouchers` 
    LEFT JOIN brands on vouchers.brand = brands.id 
    LEFT JOIN suppliers on vouchers.supplier = suppliers.id 
    WHERE vouchers.id= '" & voucherCode & "' 

Это возвращает все vouchers независимо от того, есть ли у них brands или suppliers

+0

@Jamie Hartnoll: не забудьте подняться, если вы считаете, что ответ хороший. Это дает нам все теплые нечеткие чувства – Arion

0

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

SELECT *, brands.name as brandName, suppliers.name as supplierName 
FROM `vouchers` 
LEFT JOIN brands on vouchers.brand = brands.id 
LEFT JOIN suppliers on vouchers.supplier = suppliers.id 
WHERE vouchers.id= '" & voucherCode & "' and 
     vouchers.brand = coalesce(brands.id, 0) and 
     vouchers.supplier = coalesce(suppliers.id, 0) 
Смежные вопросы