2013-07-09 9 views
5

को प्रतिस्थापित करें मेरे पास mysql क्वेरी है जहां मुझे WHERE खंड में मान को प्रतिस्थापित करने की आवश्यकता है यदि subquery कोई परिणाम या शून्य मान देता है। जो आवश्यकMySQL जांच करें कि क्या सबक्वायरी वापस शून्य है, फिर मान

चलाता है के रूप में काम करता है

मूल्य क्वेरी सफलतापूर्वक

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 
    ) 

जब मैं नीचे के रूप में इस क्वेरी को संशोधित, में खंड के अंदर सबक्वेरी पर IFNULL जाँच जोड़ने, यह त्रुटि फेंकता

'एसक्यूएल त्रुटि (1242): सबक्वायरी 1 से अधिक पंक्ति'

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 को बदलने की कोशिश की। क्या मैं गलत वाक्यविन्यास का उपयोग कर रहा हूँ।

+0

क्यों 'चयन IFNULL (v1.id_pricing, '1234')' में नहीं सबक्वेरी? –

+0

यहां समाधान के साथ एक ही समस्या है: http://stackoverflow.com/questions/9861171/how-to-resolve-this-in-mysql-1242-subquery-returns-more-than-1-row – Gimmy

+0

मैं ' मैं उस सबक्वायरी द्वारा उलझन में हूँ। यह क्या करना चाहिए? प्रदर्शन के माध्यम से एक sqlfiddle प्रदान करने पर विचार करें – Strawberry

उत्तर

1

संभवतः एक बाईं ओर ले जाने के शामिल होने और जाँच है कि या तो वहाँ एक रिकार्ड है, या कि मूल्य निर्धारण 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') 
संबंधित मुद्दे