2013-07-09 30 views
5

Tôi có truy vấn mysql nơi tôi cần thay thế giá trị trong mệnh đề WHERE nếu truy vấn con trả về không có kết quả hoặc giá trị null.MySQL kiểm tra nếu subquery trả về NULL, sau đó thay thế giá trị

Giá truy vấn mà làm việc theo yêu cầu

chạy thành công

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 
    ) 

khi tôi sửa đổi truy vấn này như dưới đây, thêm séc IFNULL trên subquery bên khoản IN, nó throws lỗi

'Lỗi SQL (1242): Truy vấn con trả về nhiều hơn 1 hàng'

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

Tôi đã thử thay thế IFNULL bằng COALESCE vẫn là kết quả tương tự. Tôi có sử dụng cú pháp sai không.

+0

Tại sao không 'CHỌN IFNULL (v1.id_pricing, '1234') 'trong truy vấn phụ? –

+0

Đây là vấn đề tương tự với giải pháp: http://stackoverflow.com/questions/9861171/how-to-resolve-this-in-mysql-1242-subquery-returns-more-than-1-row – Gimmy

+0

Tôi ' m bối rối bởi truy vấn con đó. Nó phải làm gì? Xem xét việc cung cấp một sqlfiddle bằng cách trình diễn – Strawberry

Trả lời

1

Có thể di chuyển nó đến một trái tham gia và kiểm tra xem một trong hai có một hồ sơ, hoặc chính sách giá đó là 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') 
Các vấn đề liên quan