2013-07-09 27 views
5

Alt sorgu, sonuç veya boş değer döndürmezse, WHERE yan tümcesinde değeri değiştirmeniz gereken mysql sorgum var. GerekliMySQL alt sorgu geri dönüşü null olup olmadığını kontrol edin, sonra değeri değiştirin

çalıştırır olarak çalışıyor

Fiyat sorgu Başarıyla

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 
    ) 

Ben İÇİNDE yan tümcesi içinde alt sorgu üzerinde IFNULL kontrolün eklenmesi, aşağıda bu sorguyu değiştirmek, bu hatayı

atar 'SQL Hatası (1242): Alt sorgu 1 satırdan fazla'

döndürür
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' 
       ) 
    ) 

IFNULL'u COALESCE ile yine aynı sonucu değiştirmeyi denedim. Yanlış sözdizimi kullanıyorum.

+0

Neden 'IFNULL SEÇ (v1.id_pricing, '1234')' in alt sorgu? –

+0

Çözümle ilgili benzer bir sorun var: http://stackoverflow.com/questions/9861171/how-to-resolve-this-in-mysql-1242-subquery-returns-more-than-1-row – Gimmy

+0

I ' Bu alt sorgu ile karıştı. Ne yapması gerekiyordu? – Strawberry

cevap

1

Muhtemelen SOL için bunu JOIN taşımak ve orada ya bir kayıttır veya bu fiyatlandırma 1234 olduğunu kontrol edin: -

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