Câu lệnh chọn MySQL với CASE hoặc IF ELSEIF? Không chắc chắn làm thế nào để có được kết quả


80

Tôi có một hai bảng. Một có thông tin về nhà sản xuất và bao gồm các khu vực nơi họ có thể bán. Người khác có sản phẩm của họ để bán. Chúng tôi phải giới hạn khả năng hiển thị của sản phẩm dựa trên các khu vực. Điều này giống như Netflix có các video trong hệ thống của họ chỉ có thể xem ở mọi nơi (1), chỉ ở Canada (2), chỉ ở Mỹ (3).

Tôi đang cố gắng thực hiện một truy vấn cho tôi biết sản phẩm có thể được xem ở đâu dựa trên cài đặt trong bảng nhà sản xuất.

Ví dụ: trong bảng nhà sản xuất, có hai trường được gọi là expo_new và exped_used, mỗi trường sẽ có giá trị là 1,2 hoặc 3 để giới hạn nơi có thể xem video mới hoặc đã sử dụng của họ.

Khi video được thêm vào, chúng không được gán giá trị 'exped' và điều này có nghĩa là được thực hiện nhanh chóng khi thêm chúng vào chỉ mục của chúng tôi tùy thuộc vào giá trị exp_new hoặc exp_used của nhà sản xuất hiện tại.

Những gì tôi đang cố gắng lấy là chi tiết mặt hàng và giá trị được tính cho nơi nó có thể được nhìn thấy dựa trên việc nó là mới hay đã qua sử dụng và quy tắc / giá trị được chỉ định cho nhà sản xuất cho tất cả các sản phẩm mới hoặc đã qua sử dụng của họ. Tôi cần một chữ số này trên cơ sở từng sản phẩm để hiển thị có điều kiện nó trong danh sách.

Những điều sau đây không hiệu quả, nhưng bạn sẽ hiểu được những gì tôi đang cố gắng làm. Tôi đã thử điều này với câu lệnh CASE và câu lệnh SAI / ELSEIF SAI sau đây.

Bất kỳ trợ giúp nào để gỡ lỗi này và chỉ cho tôi đi đúng hướng sẽ được đánh giá cao.

SELECT 
t2.company_name,
t2.expose_new,  // 1,2 or 3
t2.expose_used, // 1,2 or 3
t1.title,
t1.seller,
t1.status,  //can be new or used
(SELECT 
IF(status ='New',
  (select expose_new from manufacturers where id = t1.seller),1
)
ELSEIF(t1.status ='Used',
  (select expose_used from manufacturers where id = t1.seller),1
)
END IF
) as 'expose'
FROM `products` t1
join manufacturers t2 on t2.id = t1.seller
where t1.seller = 4238

Đây là phiên bản CASE thực sự có vẻ thực thi nhưng luôn dẫn đến giá trị đầu tiên cho dù điều gì xảy ra là đúng (trong trường hợp này là 1). Tôi không chắc rằng tôi có thể có thêm một bài kiểm tra khác với AND trong mỗi câu lệnh WHEN nhưng nó không đưa ra lỗi, chỉ có kết quả sai.

SELECT 
t2.company_name,
t2.expose_new,
t2.expose_used,
t1.title,
t1.status,
 CASE status
   when 'New' and t2.expose_new = 1 then 1
   when 'New' and t2.expose_new = 2 then 2
   when 'New' and t2.expose_new = 3 then 3
   when 'Used' and t2.expose_used = 1 then 1
   when 'Used' and t2.expose_used = 2 then 2
   when 'Used' and t2.expose_used = 3 then 3
END as expose
FROM `products` t1
join manufacturers t2 on t2.id = t1.seller
where t1.seller = 4238

Đây là tài nguyên rất tốt về câu lệnh trường hợp if else, mysql. Tất cả đều được giải thích bằng các ví dụ.
RN Kushwaha

Câu trả lời:


140

Hãy thử truy vấn này -

SELECT 
  t2.company_name,
  t2.expose_new,
  t2.expose_used,
  t1.title,
  t1.seller,
  t1.status,
  CASE status
      WHEN 'New' THEN t2.expose_new
      WHEN 'Used' THEN t2.expose_used
      ELSE NULL
  END as 'expose'
FROM
  `products` t1
JOIN manufacturers t2
  ON
    t2.id = t1.seller
WHERE
  t1.seller = 4238

một Q chéo - truy vấn FROM products t1, manufacturers t2 where t2.id = t1.seller and t1.seller = 4238sẽ giống nhau? Đây chỉ là một tham gia TRÁI, phải không?
Cuối cùng

1
Hóa ra là trong khi thử nghiệm, tôi đã tìm ra cách sử dụng CASE ... CASE khi status = 'New' và t2.expose_new = 1 rồi 1 khi status = 'New' và t2.expose_new = 2 rồi 2, v.v. rằng chỉ cần nêu CASE mà không có trường, tôi có thể xác định chúng trong mỗi câu lệnh when và nó hoạt động.
user409858

1
Làm thế nào để sử dụng exposetrong điều kiện?
NullPointer

NullPointer thân mến Bạn có thể giải quyết vấn đề của tôi không ?. tôi có thể tham gia bảng khác nhau bằng cách sử dụng? một cái gì đó như thế này. chọn ngày, tên, mã, nhập CASE WHEN type = 'top' INNER JOIN lam1 AS l trên o.code = l.code ELSE NULL END CASE typr = 'reverse' INNER JOIN lam2 AS l2 trên o.code = l2.code ELSE NULL KẾT THÚC TỪ đơn đặt hàng AS o
Syed Arif Iqbal

19

Cú pháp:

CASE value WHEN [compare_value] THEN result 
[WHEN [compare_value] THEN result ...] 
[ELSE result] 
END

Thay thế: CASE WHEN [điều kiện] THEN kết quả [WHEN [điều kiện] THEN kết quả ...]

mysql> SELECT CASE  WHEN 2>3 THEN 'this is true' ELSE 'this is false' END; 
+-------------------------------------------------------------+
| CASE  WHEN 2>3 THEN 'this is true' ELSE 'this is false' END |
+-------------------------------------------------------------+
| this is false                                               | 
+-------------------------------------------------------------+

Tôi sử dụng:

SELECT  act.*,
    CASE 
        WHEN (lises.session_date IS NOT NULL AND ses.session_date IS NULL) THEN lises.location_id
        WHEN (lises.session_date IS NULL AND ses.session_date IS NOT NULL) THEN ses.location_id
        WHEN (lises.session_date IS NOT NULL AND ses.session_date IS NOT NULL AND lises.session_date>ses.session_date) THEN ses.location_id
        WHEN (lises.session_date IS NOT NULL AND ses.session_date IS NOT NULL AND lises.session_date<ses.session_date) THEN lises.location_id
    END AS location_id
FROM activity AS act
LEFT JOIN li_sessions AS lises ON lises.activity_id = act.id AND  lises.session_date >= now()
LEFT JOIN session AS ses ON  ses.activity_id = act.id AND  ses.session_date >= now()
WHERE act.id

1

Một cách khác để làm điều này là sử dụng các câu lệnh IF lồng nhau. Giả sử bạn có bảng công ty và bạn muốn đếm số lượng bản ghi trong đó. Một truy vấn mẫu sẽ giống như thế này

SELECT IF(
      count(*) > 15,
      'good',
      IF(
          count(*) > 10,
          'average',
          'poor'
        ) 
      ) as data_count 
      FROM companies

Ở đây điều kiện IF thứ hai hoạt động khi điều kiện IF đầu tiên không thành công. Vì vậy Cú pháp mẫu của câu lệnh IF sẽ là IF (CONDITION, THEN, ELSE). Hy vọng nó sẽ giúp một ai đó.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.