2013-07-09 5 views
5

Ich habe MySQL-Abfrage, wo ich Wert in WHERE-Klausel ersetzen muss, wenn Unterabfrage keine Ergebnisse oder null Wert zurückgibt.MySQL überprüfen, ob Unterabfrage NULL zurückgeben, dann ersetzen Wert

Preisabfrage, die

nach Bedarf

Läuft arbeitet erfolgreich

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 
    ) 

, wenn ich wie unten diese Abfrage ändern, IFNULL Prüfung auf Unterabfrage innerhalb IN-Klausel hinzufügen, wirft es Fehler

'SQL Error (1242): Unterabfrage gibt mehr als 1 Zeile zurück'

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' 
       ) 
    ) 

Ich versuchte, IFNULL mit COALESCE immer noch das gleiche Ergebnis zu ersetzen. Benutze ich falsche Syntax.

+0

Warum nicht SELECT IFNULL (v1.id_pricing, '1234') 'in der Unterabfrage? –

+0

Hier ist ein ähnliches Problem mit einer Lösung: http://stackoverflow.com/questions/9861171/how-to-resolve-this-in-mysql-1242-subquery-returns-more-than-1-row – Gimmy

+0

I ' Ich bin verwirrt von dieser Unterabfrage. Was soll es tun? Erwägen Sie die Bereitstellung eines SQLFiddle als Demonstration – Strawberry

Antwort

1

Möglicherweise es zu einem LEFT JOIN bewegen und prüfen, ob entweder ein Datensatz ist, oder dass die Preise 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') 
Verwandte Themen