- Beranda
- Programmer Forum
[HELP !!!] masalah query mysql
...
TS
inioman
[HELP !!!] masalah query mysql
Ane punya kasus kira-kira seperti ini
![[HELP !!!] masalah query mysql](https://s.kaskus.id/images/2016/08/26/9057119_20160826034758.png)
querynya gimana ya biar muncul data seperti di atas ?
Thanks to Cahya Dsn member PHP Indonesia di FB
ini dia jawabannya
![[HELP !!!] masalah query mysql](https://s.kaskus.id/images/2016/08/26/9057119_20160826034758.png)
querynya gimana ya biar muncul data seperti di atas ?
Thanks to Cahya Dsn member PHP Indonesia di FB
ini dia jawabannya
Spoiler for Jawaban:
CREATE TABLE table1(
id TINYINT,
nama CHAR(1)
);
INSERT INTO table1(id,nama) VALUES
(1,'a'),(2,'b'),(3,'c');
SELECT * FROM table1;
+------+------+
| id | nama |
+------+------+
| 1 | a |
| 2 | b |
| 3 | c |
+------+------+
3 rows in set (0.00 sec)
CREATE TABLE table2(
id TINYINT,
jenis CHAR(2),
harga TINYINT
);
INSERT INTO table2(id,jenis,harga) VALUES
(1,'1a',10),(1,'1b',20),(1,'1c',30);
SELECT * FROM table2;
+------+-------+-------+
| id | jenis | harga |
+------+-------+-------+
| 1 | 1a | 10 |
| 1 | 1b | 20 |
| 1 | 1c | 30 |
+------+-------+-------+
3 rows in set (0.00 sec)
CREATE TABLE table3(
id TINYINT,
type VARCHAR(10),
nama VARCHAR(10),
body VARCHAR(10)
);
INSERT INTO table3(id,type,nama,body) VALUES
(1,'interior','interior1',NULL),
(1,'interior','interior2',NULL),
(1,'interior',NULL,'header1'),
(1,'eksterior','eksterior1',NULL),
(1,'eksterior','eksterior2',NULL),
(1,'eksterior',NULL,'header2');
mysql> SELECT * FROM table3;
+------+-----------+------------+---------+
| id | type | nama | body |
+------+-----------+------------+---------+
| 1 | interior | interior1 | NULL |
| 1 | interior | interior2 | NULL |
| 1 | interior | NULL | header1 |
| 1 | eksterior | eksterior1 | NULL |
| 1 | eksterior | eksterior2 | NULL |
| 1 | eksterior | NULL | header2 |
+------+-----------+------------+---------+
6 rows in set (0.00 sec)
SELECT
x.id,
x.nama,
x.jml_jenis,
y.jml_int_nama,
y.jml_int_body,
y.jml_eks_nama,
y.jml_eks_body
FROM
(
SELECT
a.id,
a.nama,
COUNT(b.jenis) AS jml_jenis
FROM
table1 a
JOIN table2 b USING(id)
) x
JOIN
(
SELECT
id,
SUM(IF(type='interior' AND nama IS NOT NULL,1,0)) AS jml_int_nama,
SUM(IF(type='eksterior' AND nama IS NOT NULL,1,0)) AS jml_eks_nama,
SUM(IF(type='interior' AND body IS NOT NULL,1,0)) AS jml_int_body,
SUM(IF(type='eksterior' AND body IS NOT NULL,1,0)) AS jml_eks_body
FROM
table3
GROUP BY id
) y USING(id)
WHERE
x.id=1
GROUP BY x.id;
+------+------+-----------+--------------+--------------+--------------+--------------+
| id | nama | jml_jenis | jml_int_nama | jml_int_body | jml_eks_nama | jml_eks_body |
+------+------+-----------+--------------+--------------+--------------+--------------+
| 1 | a | 3 | 2 | 1 | 2 | 1 |
+------+------+-----------+--------------+--------------+--------------+--------------+
1 row in set (0.02 sec)
--
CREATE TABLE table4(
id TINYINT,
type VARCHAR(10),
nama VARCHAR(10),
body VARCHAR(10)
);
INSERT INTO table4(id,type,nama,body) VALUES
(1,'interior','interior1',''),
(1,'interior','interior2',''),
(1,'interior','','header1'),
(1,'eksterior','eksterior1',''),
(1,'eksterior','eksterior2',''),
(1,'eksterior','','header2');
SELECT * FROM table4;
+------+-----------+------------+---------+
| id | type | nama | body |
+------+-----------+------------+---------+
| 1 | interior | interior1 | |
| 1 | interior | interior2 | |
| 1 | interior | | header1 |
| 1 | eksterior | eksterior1 | |
| 1 | eksterior | eksterior2 | |
| 1 | eksterior | | header2 |
+------+-----------+------------+---------+
6 rows in set (0.00 sec)
SELECT
x.id,
x.nama,
x.jml_jenis,
y.jml_int_nama,
y.jml_int_body,
y.jml_eks_nama,
y.jml_eks_body
FROM
(
SELECT
a.id,
a.nama,
COUNT(b.jenis) AS jml_jenis
FROM
table1 a
JOIN table2 b USING(id)
) x
JOIN
(
SELECT
id,
SUM(IF(type='interior' AND nama <>'',1,0)) AS jml_int_nama,
SUM(IF(type='eksterior' AND nama <>'',1,0)) AS jml_eks_nama,
SUM(IF(type='interior' AND body <>'',1,0)) AS jml_int_body,
SUM(IF(type='eksterior' AND body <>'',1,0)) AS jml_eks_body
FROM
table4
GROUP BY id
) y USING(id)
WHERE
x.id=1
GROUP BY x.id;
+------+------+-----------+--------------+--------------+--------------+--------------+
| id | nama | jml_jenis | jml_int_nama | jml_int_body | jml_eks_nama | jml_eks_body |
+------+------+-----------+--------------+--------------+--------------+--------------+
| 1 | a | 3 | 2 | 1 | 2 | 1 |
+------+------+-----------+--------------+--------------+--------------+--------------+
1 row in set (0.00 sec)
-- buat belajar aja
-- [1] ambil jumlah (count) jenis dari table2 berdasarkan id, join dengan table1 untuk mendapatkan nama
-- [2] ambil jumlah (sum) interior/eksterior nama/body yg tidak kosong dari table 3/4 berdasarkan id,
-- [3] join hasil [1] (beri alias sebagai tabel x) dengan hasil [2] (beri alias tabel y) grouping berdasarkan id
-- jangan dibata ane cuman iseng aja cmiiw
-- cobain juga model gini :
SELECT
a.id,
a.nama,
(SELECT COUNT(c.jenis) FROM table2 c WHERE c.id=a.id GROUP BY c.id) AS jml_jenis,
SUM(IF(b.type='interior' AND b.nama <>'',1,0)) AS jml_int_nama,
SUM(IF(b.type='eksterior' AND b.nama <>'',1,0)) AS jml_eks_nama,
SUM(IF(b.type='interior' AND b.body <>'',1,0)) AS jml_int_body,
SUM(IF(b.type='eksterior' AND b.body <>'',1,0)) AS jml_eks_body
FROM
table1 a
JOIN table4 b USING(id)
GROUP BY a.id;
id TINYINT,
nama CHAR(1)
);
INSERT INTO table1(id,nama) VALUES
(1,'a'),(2,'b'),(3,'c');
SELECT * FROM table1;
+------+------+
| id | nama |
+------+------+
| 1 | a |
| 2 | b |
| 3 | c |
+------+------+
3 rows in set (0.00 sec)
CREATE TABLE table2(
id TINYINT,
jenis CHAR(2),
harga TINYINT
);
INSERT INTO table2(id,jenis,harga) VALUES
(1,'1a',10),(1,'1b',20),(1,'1c',30);
SELECT * FROM table2;
+------+-------+-------+
| id | jenis | harga |
+------+-------+-------+
| 1 | 1a | 10 |
| 1 | 1b | 20 |
| 1 | 1c | 30 |
+------+-------+-------+
3 rows in set (0.00 sec)
CREATE TABLE table3(
id TINYINT,
type VARCHAR(10),
nama VARCHAR(10),
body VARCHAR(10)
);
INSERT INTO table3(id,type,nama,body) VALUES
(1,'interior','interior1',NULL),
(1,'interior','interior2',NULL),
(1,'interior',NULL,'header1'),
(1,'eksterior','eksterior1',NULL),
(1,'eksterior','eksterior2',NULL),
(1,'eksterior',NULL,'header2');
mysql> SELECT * FROM table3;
+------+-----------+------------+---------+
| id | type | nama | body |
+------+-----------+------------+---------+
| 1 | interior | interior1 | NULL |
| 1 | interior | interior2 | NULL |
| 1 | interior | NULL | header1 |
| 1 | eksterior | eksterior1 | NULL |
| 1 | eksterior | eksterior2 | NULL |
| 1 | eksterior | NULL | header2 |
+------+-----------+------------+---------+
6 rows in set (0.00 sec)
SELECT
x.id,
x.nama,
x.jml_jenis,
y.jml_int_nama,
y.jml_int_body,
y.jml_eks_nama,
y.jml_eks_body
FROM
(
SELECT
a.id,
a.nama,
COUNT(b.jenis) AS jml_jenis
FROM
table1 a
JOIN table2 b USING(id)
) x
JOIN
(
SELECT
id,
SUM(IF(type='interior' AND nama IS NOT NULL,1,0)) AS jml_int_nama,
SUM(IF(type='eksterior' AND nama IS NOT NULL,1,0)) AS jml_eks_nama,
SUM(IF(type='interior' AND body IS NOT NULL,1,0)) AS jml_int_body,
SUM(IF(type='eksterior' AND body IS NOT NULL,1,0)) AS jml_eks_body
FROM
table3
GROUP BY id
) y USING(id)
WHERE
x.id=1
GROUP BY x.id;
+------+------+-----------+--------------+--------------+--------------+--------------+
| id | nama | jml_jenis | jml_int_nama | jml_int_body | jml_eks_nama | jml_eks_body |
+------+------+-----------+--------------+--------------+--------------+--------------+
| 1 | a | 3 | 2 | 1 | 2 | 1 |
+------+------+-----------+--------------+--------------+--------------+--------------+
1 row in set (0.02 sec)
--
CREATE TABLE table4(
id TINYINT,
type VARCHAR(10),
nama VARCHAR(10),
body VARCHAR(10)
);
INSERT INTO table4(id,type,nama,body) VALUES
(1,'interior','interior1',''),
(1,'interior','interior2',''),
(1,'interior','','header1'),
(1,'eksterior','eksterior1',''),
(1,'eksterior','eksterior2',''),
(1,'eksterior','','header2');
SELECT * FROM table4;
+------+-----------+------------+---------+
| id | type | nama | body |
+------+-----------+------------+---------+
| 1 | interior | interior1 | |
| 1 | interior | interior2 | |
| 1 | interior | | header1 |
| 1 | eksterior | eksterior1 | |
| 1 | eksterior | eksterior2 | |
| 1 | eksterior | | header2 |
+------+-----------+------------+---------+
6 rows in set (0.00 sec)
SELECT
x.id,
x.nama,
x.jml_jenis,
y.jml_int_nama,
y.jml_int_body,
y.jml_eks_nama,
y.jml_eks_body
FROM
(
SELECT
a.id,
a.nama,
COUNT(b.jenis) AS jml_jenis
FROM
table1 a
JOIN table2 b USING(id)
) x
JOIN
(
SELECT
id,
SUM(IF(type='interior' AND nama <>'',1,0)) AS jml_int_nama,
SUM(IF(type='eksterior' AND nama <>'',1,0)) AS jml_eks_nama,
SUM(IF(type='interior' AND body <>'',1,0)) AS jml_int_body,
SUM(IF(type='eksterior' AND body <>'',1,0)) AS jml_eks_body
FROM
table4
GROUP BY id
) y USING(id)
WHERE
x.id=1
GROUP BY x.id;
+------+------+-----------+--------------+--------------+--------------+--------------+
| id | nama | jml_jenis | jml_int_nama | jml_int_body | jml_eks_nama | jml_eks_body |
+------+------+-----------+--------------+--------------+--------------+--------------+
| 1 | a | 3 | 2 | 1 | 2 | 1 |
+------+------+-----------+--------------+--------------+--------------+--------------+
1 row in set (0.00 sec)
-- buat belajar aja
-- [1] ambil jumlah (count) jenis dari table2 berdasarkan id, join dengan table1 untuk mendapatkan nama
-- [2] ambil jumlah (sum) interior/eksterior nama/body yg tidak kosong dari table 3/4 berdasarkan id,
-- [3] join hasil [1] (beri alias sebagai tabel x) dengan hasil [2] (beri alias tabel y) grouping berdasarkan id
-- jangan dibata ane cuman iseng aja cmiiw

-- cobain juga model gini :
SELECT
a.id,
a.nama,
(SELECT COUNT(c.jenis) FROM table2 c WHERE c.id=a.id GROUP BY c.id) AS jml_jenis,
SUM(IF(b.type='interior' AND b.nama <>'',1,0)) AS jml_int_nama,
SUM(IF(b.type='eksterior' AND b.nama <>'',1,0)) AS jml_eks_nama,
SUM(IF(b.type='interior' AND b.body <>'',1,0)) AS jml_int_body,
SUM(IF(b.type='eksterior' AND b.body <>'',1,0)) AS jml_eks_body
FROM
table1 a
JOIN table4 b USING(id)
GROUP BY a.id;
Diubah oleh inioman 02-09-2016 15:02
tien212700 memberi reputasi
1
1.2K
Kutip
3
Balasan
Komentar yang asik ya
Mari bergabung, dapatkan informasi dan teman baru!
Programmer Forum
20.3KThread•5.2KAnggota
Urutkan
Terlama
Komentar yang asik ya