2015-03-09 2 views
1

ОК, так что этот человек заставил меня разорвать мои волосы на несколько часов. Я чувствую, что есть что-то очевидное, что я пропускаю.MySQL SQL Select Query with Multiple Sub-Selects

У меня есть 2 таблицы, службы и марки

service 
------- 
id 
brand 

brand 
----- 
id 
brandName 

Так service.brand может быть любой из них:

Blank 
"Other" 
Integer (matches brand.id) 
String (matches brand.brandName) 
String (Not Blank, Not Other, Not brand.brandName) 

Я пытаюсь написать запрос, который будет вытащите правильный бренд из таблицы брендов, и если значение service.brand отсутствует в brand.id или brand.brandName, тогда отобразите все, что есть.

До сих пор у меня все работает, за исключением того, что он не потянет запись, если service.brand не был пустым, а не другим, а не в brand.id, а не в brand.brandName. (который я называю OtherThanOther отсюда).

Теперь моя последняя попытка тянет в основном правильную, но поле OtherThanOther растягивается много раз, например, если общее количество записей - 40, другое - одна и та же запись почти 20 раз. ПОМОГИТЕ!

Моя последняя попытка ..

select 
    s.*, b.brandName as bname 
from 
    service s, brand b 
where 
    s.brand = b.brandName 
or 
    s.brand = b.id 
or 
    s.brand = 'Other' 
or 
    s.brand = '' 
or 
    (  
     s.brand not in (select brandName from brand) 
     and 
     s.brand not in (select id from brand) 
     and 
     s.brand != 'Other' 
     and 
     s.brand != '' 
    ) 

Пример таблицы данных

service 
------- 
1 5 
2 Dell 
3 SomeRandom 
4 
5 Other 

brand 
----- 

1 HP 
2 Gateway 
3 Dell 
4 Compaq 
5 Toshiba 

мои результаты запроса ..

(service.id, service.brand, brand.id, brand.brandName, bname) 
------------------------------------------------------------- 
1 5 5 Toshiba Toshiba 
2 Dell 3 Dell Dell 
3 SomeRandom, brand.id, brand.brandName, brand.brandName 
3 SomeRandom, brand.id, brand.brandName, brand.brandName 
3 SomeRandom, brand.id, brand.brandName, brand.brandName 
3 SomeRandom, brand.id, brand.brandName, brand.brandName 
3 SomeRandom, brand.id, brand.brandName, brand.brandName 
4 '', null, null, null 
5 Other, null, null, null 

Мне это нужно просто тянуть SomeRandom раз, группа по воны 't работает, потому что может быть несколько полей с тем же значением, что и SomeRandom. Любая помощь очень ценится.

Спасибо!

+0

присоединиться к двум таблицы и использование CASE – ConsiderItDone

+0

Можете ли вы опубликовать ответ о том, как это будет работать? –

+0

Проверьте мой ответ и скажите, будет ли это работать для вас. –

ответ

1
select 
    s.*, 
    CASE 
     WHEN b_id.brandName IS NOT NULL THEN b_id.brandName 
     WHEN b.brandName IS NOT NULL THEN b.brandName 
     ELSE s.brand 
    END as bname 
from 
    service s 
LEFT JOIN brand b_id 
ON CAST(s.brand AS UNSIGNED) = b_id.id 
LEFT JOIN brand b 
ON s.brand = b.brandName 
+0

Извините, я не понимаю, что означает «введите код здесь» в ответ. –

+0

:-) Я тоже не представляю. @ NotoriousPet0 проверить обновление. просто удалите это из запроса :-) – Alex

+0

Удивительный, ты лучший! –

0

Вы используете старый стиль inner join:

from service s, brand b 
where s.brand = b.brandName or ... 

Более четко написано так:

from service s 
inner join brand b on s.brand = b.brandName or ... 

В новой форме, проблема сразу выделяется. inner join отфильтровывает непревзойденные строки. Используйте left join вместо:

from service s 
left join brand b on s.brand = b.brandName or ... 

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

+0

Внутренние и левые объединяют те же результаты. –

0

JOIN 2 таблицы с несколькими условиями. Что-то вроде этого:

SELECT s.*, b.brandName AS bname 
FROM service AS s 
INNER JOIN brand AS b 
ON s.brand = b.brandName OR 
    s.brand = b.id OR 
    s.brand = 'Other' OR 
    s.brand = '' OR 
    (s.brand NOT IN (SELECT brandName FROM brand) AND 
    s.brand NOT IN (SELECT id FROM brand) AND 
    s.brand != 'Other' AND 
    s.brand != '') 
+0

Не работал, когда я попробовал. –

+0

Он вызывает ошибки? Отредактировано, попробуйте использовать 'INNER JOIN' –

+0

нет вытаскивает одинаковые данные, которые он вытаскивал –

0

Первое - использовать JOIN!

select s.*, b.brandName as bname 
from service s 
    LEFT JOIN brand b ON s.brand = b.brandName or s.brand = b.id 

Затем вы можете добавить осмысление условий - например WHERE NOT s.brand IS NULL

Эти condotions из вас приводят к результату, в котором ваши строки таблицы умножаются друг с другом:

s.brand = 'Other' 
or 
    s.brand = '' 
or 
    (  
     s.brand not in (select brandName from brand) 
     and 
     s.brand not in (select id from brand) 
     and 
     s.brand != 'Other' 
     and 
     s.brand != '' 
    ) 
+0

Когда это« ON s.brand = b.brandName или s.brand = b. id "не соответствует, он дает мне запись для каждой записи в таблице брендов. поэтому, если 17 разных записей в таблице брендов, то я получаю 17 обманов (ну, имя бренда заканчивается как brand.brandName для строки, поэтому его 17 разных значений, но его «все в одной записи начального стола службы») –

+0

Я сказал вам затем добавьте условие чувствительности. btw это не даст вам каждую запись из таблицы брендов. left join дает вам каждую запись из сервиса и соответствует только бренду. – niyou

+0

Я сделал все так, как вы сказали мне. Left join wont 'работает тогда, основываясь на том, что вы говорите, потому что иногда это не будет в таблице брендов. –