2013-07-09 18 views
5

Mam zapytanie mysql, w którym muszę zastąpić wartość w klauzuli WHERE, jeśli podzapytanie nie zwraca żadnych wyników lub wartości pustej.MySQL sprawdź, czy podzapytanie zwróci NULL, a następnie zastąp wartość

Cena kwerendy, która działa zgodnie z wymaganiami

działał poprawnie

SELECT `prices` FROM `pricing` 
WHERE (3 BETWEEN `from_unit` AND `to_unit`) 
AND `type` = 1 
AND `id_pricing` IN 
    ( 
     SELECT v1.`id_pricing` FROM `values` AS v1 
     INNER JOIN `values` AS v2 ON v1.`id_pricing` = v2.`id_pricing` 
     INNER JOIN `values` AS v3 ON v1.`id_pricing` = v3.`id_pricing` 
     INNER JOIN `values` AS v4 ON v1.`id_pricing` = v4.`id_pricing` 
     WHERE v1.`id_attribute` = 1 AND v1.`id_value` = 1 
     AND v2.`id_attribute` = 7 AND v2.`id_value` = 63 
     AND v3.`id_attribute` = 8 AND v3.`id_value` = 87 
     AND v4.`id_attribute` = 12 AND v4.`id_value` = 143 
    ) 

kiedy modyfikować tej kwerendy jak poniżej, dodając kontrolę IFNULL na podzapytaniu wewnątrz klauzuli, to rzuca error

"Błąd SQL (1242): podzapytanie zwraca więcej niż 1 wiersz"

SELECT `prices` FROM `pricing` 
WHERE (3 BETWEEN `from_unit` AND `to_unit`) 
AND `type` = 1 
AND `id_pricing` IN 
    ( IFNULL (
        ( SELECT v1.`id_pricing` FROM `values` AS v1 
         INNER JOIN `values` AS v2 ON v1.`id_pricing` = v2.`id_pricing` 
         INNER JOIN `values` AS v3 ON v1.`id_pricing` = v3.`id_pricing` 
         INNER JOIN `values` AS v4 ON v1.`id_pricing` = v4.`id_pricing` 
         WHERE v1.`id_attribute` = 1 AND v1.`id_value` = 1 
         AND v2.`id_attribute` = 7 AND v2.`id_value` = 63 
         AND v3.`id_attribute` = 8 AND v3.`id_value` = 87 
         AND v4.`id_attribute` = 12 AND v4.`id_value` = 143 
        ), 
        '1234' 
       ) 
    ) 

Próbowałem zastąpić IFNULL COALESCE nadal ten sam wynik. Czy używam niewłaściwej składni?

+0

Dlaczego nie 'SELECT IFNULL (v1.id_pricing, '1234')' w podzapytanie? –

+0

Oto podobny problem z rozwiązaniem: http://stackoverflow.com/questions/9861171/how-to-resolve-this-in-mysql-1242-subquery-returns-more-than-1-row – Gimmy

+0

I ' m zdezorientowany tym podzapytaniem. Co to ma robić? Rozważ dostarczenie pikselowej płaszczyzny do demonstracji – Strawberry

Odpowiedz

1

Ewentualnie przenieść go do LEFT JOIN i sprawdzić, czy istnieje zapis, lub że ceny to 1234: -

SELECT `prices` 
FROM `pricing` 
LEFT OUTER JOIN 
(
    SELECT v1.`id_pricing`, COUNT(*) 
    FROM `values` AS v1 
    INNER JOIN `values` AS v2 ON v1.`id_pricing` = v2.`id_pricing` 
    INNER JOIN `values` AS v3 ON v1.`id_pricing` = v3.`id_pricing` 
    INNER JOIN `values` AS v4 ON v1.`id_pricing` = v4.`id_pricing` 
    WHERE v1.`id_attribute` = 1 AND v1.`id_value` = 1 
    AND v2.`id_attribute` = 7 AND v2.`id_value` = 63 
    AND v3.`id_attribute` = 8 AND v3.`id_value` = 87 
    AND v4.`id_attribute` = 12 AND v4.`id_value` = 143 
    GROUP BY v1.`id_pricing` 
) Sub1 
ON Sub1.id_pricing = pricing.id_pricing 
WHERE (3 BETWEEN `from_unit` AND `to_unit`) 
AND `type` = 1 
AND (Sub1.`id_pricing` IS NOT NULL 
OR pricing.id_pricing = '1234')