Asked May 6th, 8:55 AM 68 0 2
  • 68 0 2
+4

Hỏi về custom column. Mysql 5.7

Share
  • 68 0 2

Ai có kinh nghiệm chỉ mình cách làm các custom column trong câu select của mysql chạy theo thứ tự xác định, mình đã thử cách bên dưới nhưng booking_status vẫn ra null vì @temp null. không dùng sub query hay gì được nhé, vì câu query để nhóm thành group rất phức tạp, mà cũng không thể thay đổi logic của cả service này được

(
        CASE WHEN @temp :=(
            CONCAT(
                "",
                GROUP_CONCAT(
                    CASE 
                    	WHEN `beauty`.`reserve`.`status` = 1 AND `beauty`.`reserve`.`date` <= CURDATE() THEN '1' 
                    	WHEN `beauty`.`reserve`.`status` = 1 AND `beauty`.`reserve`.`date` > CURDATE() THEN '2' 
                    	WHEN `beauty`.`reserve`.`status` <> 1 THEN '0'
                    END SEPARATOR ','
                ),
                ","
            )
        ) THEN (
            CASE 
            	WHEN @temp LIKE '%1%' AND @temp LIKE '%2%' THEN 'visited, booking'
            	WHEN @temp LIKE '%1%' THEN 'visited' 
            	WHEN @temp LIKE '%2%' THEN 'booking' 
            	WHEN @temp NOT LIKE '%1%' AND @temp NOT LIKE '%2%' THEN 'not visited'
        	END
    	)
		END
	) AS booking_status

2 ANSWERS


Answered May 7th, 2:16 AM
0

@temp là cách bạn đang tính dùng declare trong mysql. Nhưng theo mình thì nó hoạt động không tốt như trong thằng mssql . Điều nữa bạn đang dùng case when then vô tội vạ VD như này nhé:

CONCAT(
    "",
    GROUP_CONCAT(
        CASE 
          WHEN `repitte_beauty`.`reserve`.`status` = 1 AND `repitte_beauty`.`reserve`.`date` <= CURDATE() THEN '1' 
          WHEN `repitte_beauty`.`reserve`.`status` = 1 AND `repitte_beauty`.`reserve`.`date` > CURDATE() THEN '2' 
          WHEN `repitte_beauty`.`reserve`.`status` <> 1 THEN '0'
        END SEPARATOR ','
    ),
    ","
)

Kết quả theo mình thấy thì nod đang là concat("",group_concat('1').",") đấy lá nếu may mắn nó chạy được nhé cái này chạy được thì kết quả là 1,, Theo mình biết group_concat để nối giá trị của nhiều field trong table mà bạn query lại với nhau. Nếu thế thì giờ nó đang không được đúng lắm.

Còn case trên case when @temp vậy so sánh của nó là gì ?. Có vẻ bạn đang suy nghĩ phức tạp hóa quá. Hãy thử cách này xem

(
  CASE
    WHEN `repitte_beauty`.`reserve`.`status` = 1 THEN 'visited, booking'
    WHEN `repitte_beauty`.`reserve`.`status` = 1 AND `repitte_beauty`.`reserve`.`date` <= CURDATE() THEN 'visited' 
    WHEN `repitte_beauty`.`reserve`.`status` = 1 AND `repitte_beauty`.`reserve`.`date` > CURDATE() THEN 'booking' 
    ELSE 'not visited'
  END
) AS booking_status
Share
May 7th, 2:54 AM
  • trong 1 group có nhiều reserve record, so sánh như thế thì không được
  • về phần concat lồng group concat là để kết quả hiển thị kiểu "1,1,1,1,1,1,". Code thì chẳng có cái éo gì là may mắn chạy được đâu.
  • vì theo cơ chế của mysql mình đã giải thích bên trên, khi có nhiều custom column thì không thể xác định thằng nào sẽ được thực thi trước, mình đặt statement tính toán trong case when để xác định statement đó sẽ được thực thi trước, gắn vào @temp rồi mới thực thi statement sau.

Mong bạn đọc kỹ trước khi kết luận mình dùng case when vô tội vạ

0
| Reply
Share
Answered May 15th, 4:34 AM
0
COALESCE(
       GROUP_CONCAT(DISTINCT CASE
               WHEN `reserve`.`status` = 1 AND `reserve`.`date` <= CURDATE() THEN '来店済'
               WHEN `reserve`.`status` = 2 AND `reserve`.`date` <= CURDATE() THEN '予約中'
        END),
 '未予約') as booking_status

đã làm đc

Share