คำตอบที่ได้รับเลือกจากเจ้าของกระทู้
ความคิดเห็นที่ 1
ถ้าจะเขียนให้รองรับค่าใน w มีกี่ค่าก็ได้ ต้องเขียนเป็น store procedure
แต่ถ้าไม่สนใจเรื่องนั้น สมมติจำกัดให้ใน w มีไม่เกิน 10 ค่า ก็เขียนแบบนี้
SELECT
SUBSTRING_INDEX(SUBSTRING_INDEX(W, ',', SEQ), ',', -1) AS W,
M
FROM
(
SELECT
W,
M,
1+LENGTH(W) - LENGTH(REPLACE(W, ',', '')) AS NUM_FIELD
FROM
A
) T_A,
(
SELECT 1 AS SEQ UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5
UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9 UNION SELECT 10
) T
WHERE
SEQ <= NUM_FIELD
หรือถ้า 10 ค่าน้อยเกินไป แก้ไขให้รองรับ w มีไม่เกิน 100 ค่า ก็แก้เป็นแบบนี้
SELECT
SUBSTRING_INDEX(SUBSTRING_INDEX(W, ',', SEQ), ',', -1) AS W,
M
FROM
(
SELECT
W,
M,
1+LENGTH(W) - LENGTH(REPLACE(W, ',', '')) AS NUM_FIELD
FROM
A
) T_A,
(
SELECT DISTINCT
1+N1+10*N2 AS SEQ
FROM
(
SELECT 0 AS N1 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4
UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9
) T_1,
(
SELECT 0 AS N2 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4
UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9
) T_2
) T
WHERE
SEQ <= NUM_FIELD
แต่ถ้าไม่สนใจเรื่องนั้น สมมติจำกัดให้ใน w มีไม่เกิน 10 ค่า ก็เขียนแบบนี้
SELECT
SUBSTRING_INDEX(SUBSTRING_INDEX(W, ',', SEQ), ',', -1) AS W,
M
FROM
(
SELECT
W,
M,
1+LENGTH(W) - LENGTH(REPLACE(W, ',', '')) AS NUM_FIELD
FROM
A
) T_A,
(
SELECT 1 AS SEQ UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5
UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9 UNION SELECT 10
) T
WHERE
SEQ <= NUM_FIELD
หรือถ้า 10 ค่าน้อยเกินไป แก้ไขให้รองรับ w มีไม่เกิน 100 ค่า ก็แก้เป็นแบบนี้
SELECT
SUBSTRING_INDEX(SUBSTRING_INDEX(W, ',', SEQ), ',', -1) AS W,
M
FROM
(
SELECT
W,
M,
1+LENGTH(W) - LENGTH(REPLACE(W, ',', '')) AS NUM_FIELD
FROM
A
) T_A,
(
SELECT DISTINCT
1+N1+10*N2 AS SEQ
FROM
(
SELECT 0 AS N1 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4
UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9
) T_1,
(
SELECT 0 AS N2 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4
UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9
) T_2
) T
WHERE
SEQ <= NUM_FIELD
แสดงความคิดเห็น
MY SQL ที่แยกระเบียนออกมาอย่างนี้ต้องเขียนอย่างไร
w m
----------------------------
A1,A2,A3 12
D 99
E 20
F1,F2 86
- ผลลัพท์ที่ต้องการ
w m
----------------
A1 12
A2 12
A3 12
D 99
E 20
F1 86
F2 86
คือ
1. ลิสแยก w จากตาราง A ที่มีคอมมา , ออกมาสร้างระเบียนใหม่ โดยมีข้อมูล m เหมือนกัน
2. กรณีไม่มี ก็ดึงระเบียนนั้นมาเลย
ขอบคุณ อีกครั้งในความช่วยเหลือ
( รู้สึกเกรงใจเหมือนกัน ที่มาถามบ่อยๆ พอดีไม่ได้เรียนสายนี้มา )