 |
ดึงข้อมูลจาก database ข้อมูลที่เป็นแบบนี้ 1,2,4 แล้วต้องการแยกการแสดงผลและนับจำนวน ต้องทำยังไงครับ |
|
 |
|
|
 |
 |
|
Example
$cars = array(
array(
"name"=>"Urus",
"record"=>"10,12",
),
array(
"name"=>"Cayenne",
"record"=>"10,15",
),
);
$price = array(
10 => 1000,
12 => 1200,
15 => 1500,
);
for($i=0;$i<count($cars);$i++){
echo $cars[$i]['name']."<br>";
$exps = explode(',',$cars[$i]['record']);
$total = 0;
foreach($exps as $exp){
echo $exp."=".$price[$exp]."<br>";
$total += $price[$exp];
}
echo "total =".$total."<br>";
}
อ่าน Code ทำความเข้าใจแล้วนำไป Dev กับ mysqli
|
ประวัติการแก้ไข 2020-10-19 14:44:39
 |
 |
 |
 |
Date :
2020-10-19 14:42:00 |
By :
Genesis™ |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
วิธีคิวรี่เพื่อได้เลขเรียงด้านหน้า
https://stackoverflow.com/questions/58929877/mysql-split-comma-separated-values-and-group-by-result
วิธีนับจำนวน เปลี่ยน - เป็น ฟิลด์ที่ได้จากด้านบน
https://stackoverflow.com/questions/7020001/how-to-count-items-in-comma-separated-list-mysql
Code (SQL)
SELECT
result,
LENGTH(GROUP_CONCAT(file_path)) - LENGTH(REPLACE(GROUP_CONCAT(file_path), result, '')) AS qty
FROM (
SELECT
SUBSTRING_INDEX(SUBSTRING_INDEX(file_path, ',', a.letter + 1), ',', -1) result,
file_path
FROM book
INNER JOIN (SELECT 0 letter UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3) a ON LENGTH(REPLACE(file_path, ',' , '')) <= LENGTH(file_path) - a.letter
) a
GROUP BY result
HAVING COUNT(result) > 0 AND result <> ''
ORDER BY result
|
 |
 |
 |
 |
Date :
2020-10-20 09:15:09 |
By :
{Cyberman} |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ถ้ามีตัวอย่างข้อมูล table structure, data ก็เอามาลง จะได้มีคนเอาไปทดลองเขียนหาวิธีแสดง
อย่ามาแต่ภาพ
|
 |
 |
 |
 |
Date :
2020-10-20 11:43:52 |
By :
mr.v |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
No.2 สอนดื่มไวด์ (Widenius' Solutions)
มี 2 ขั้นตอนสำคัญ
Step 1 - แจงตารางให้ได้แบบนี้

Step 2 - GROUP BY
ดูสด http://sqlfiddle.com/#!9/9beff9/1
No.1 สอนการเลอร์ (Lerdorf' school)
ง่ายเพราะเป็นการแก้ปัญหาในระดับโปรแกรม (App Level Solution)
ต้องการความท้าทาย ต้องกินสตอร์ (Stored Procedure)
Code (SQL)
CREATE TABLE table1
(`id` int, `value` varchar(20))
;
INSERT INTO table1
(`id`, `value`)
VALUES
(1, 'Red,Green,Blue'),
(2, 'Orangered,Periwinkle'),
(3, 'Green,Blue,Orangered'),
(4, 'Red,Blue')
;
DELIMITER $$
DROP PROCEDURE IF EXISTS explode_table $$
CREATE PROCEDURE explode_table(bound VARCHAR(255))
BEGIN
DECLARE id INT DEFAULT 0;
DECLARE value TEXT;
DECLARE occurance INT DEFAULT 0;
DECLARE i INT DEFAULT 0;
DECLARE splitted_value TEXT;
DECLARE done INT DEFAULT 0;
DECLARE cur1 CURSOR FOR SELECT table1.id, table1.value
FROM table1
WHERE table1.value != '';
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
DROP TEMPORARY TABLE IF EXISTS table2;
CREATE TEMPORARY TABLE table2(
`id` INT NOT NULL,
`value` VARCHAR(255) NOT NULL
) ENGINE=Memory;
OPEN cur1;
read_loop: LOOP
FETCH cur1 INTO id, value;
IF done THEN
LEAVE read_loop;
END IF;
SET occurance = (SELECT LENGTH(value)
- LENGTH(REPLACE(value, bound, ''))
+1);
SET i=1;
WHILE i <= occurance DO
SET splitted_value =
(SELECT REPLACE(SUBSTRING(SUBSTRING_INDEX(value, bound, i),
LENGTH(SUBSTRING_INDEX(value, bound, i - 1)) + 1), ',', ''));
INSERT INTO table2 VALUES (id, splitted_value);
SET i = i + 1;
END WHILE;
END LOOP;
SELECT t.value `สี`, COUNT(t.value) `จำนวน` FROM (SELECT * FROM table2) t GROUP BY t.value;
CLOSE cur1;
END; $$
-- เวลาเรียกใช้
CALL explode_table(',');
ดูสด
สีเขียว คือ keyword นอกนั้นไม่ใช่ เพราะผมตั้งเอง 
https://www.mysqltutorial.org/mysql-stored-procedure-tutorial.aspx/
ถ้าชอบกินสตอร์ ค่อยๆ ศึกษาไป (อย่างน้อยให้ถึงเรื่อง Cursor...แล้วชีวิตจะง่ายขึ้น )
|
 |
 |
 |
 |
Date :
2020-10-21 14:51:32 |
By :
PhrayaDev |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ขอบคุณทุกท่านมากครับ ลองไปปรับใช้ได้แล้วครับ ใช้เวลาไปหลายวันเลยกว่าจะมั่วได้
|
 |
 |
 |
 |
Date :
2020-10-22 15:42:28 |
By :
newphpuser |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
|
|