- Beranda
- Komunitas
- Tech
- Programmer Forum
[ASK] PDO - MYSQL Gabungkan row dengan Datetime dan Average


TS
smartparents
[ASK] PDO - MYSQL Gabungkan row dengan Datetime dan Average
Help suhu-suhu PHP dan MySQL
Ane punya tabel hasilnya seperti ini:
![[ASK] PDO - MYSQL Gabungkan row dengan Datetime dan Average](https://s.kaskus.id/images/2016/08/08/7729600_20160808031230.jpg)
Itu hasil di tabel pertama adalah Join 3 tabel:
Tabel induk:
myproyek
columns: proyek_id, proyek_nama
Tabel Detail:
proyek_detil
columns: detil_id,proyek_id, nilai, buyer_id, st_proyek,end_proyek,status
Tabel Klien:
mybuyer
columns: buyer_id, nama_buyer
PDO Join tabel
PHP untuk view
Ane pengen proyek yang sama digabungkan menjadi 1 row saja dengan prinsip:
- Grup berdasarkan nama proyek (dari "proyek_id", primary key)
- untuk "Start" , skip null atau empty, pilih tgl yang paling awal ("st_proyek", datetime) -> Pada proyek A, start paling awal 3 Jan 2016
- untuk "End" , skip null atau empty, pilih tgl yang paling akhir ("end_proyek", datetime) -> Pada proyek A, akhir terdekat 29 Jan 2016
- untuk "Nilai", skip null atau empty, average dari bbrp row yang punya nilai. Contoh di atas-> (400.000+420.000)/2 hasilnya 410.000
Gambarannya yang diinginkan seperti ini
![[ASK] PDO - MYSQL Gabungkan row dengan Datetime dan Average](https://s.kaskus.id/images/2016/08/08/7729600_20160808031248.jpg)
Memakai "GROUP BY proyek_detil.proyek_id" memang akan menggrup proyek, tapi tetap saja masih perlu filter berdasarkan tanggal terdekat/terjauh lalu melakukan average. Nah ini ane belum ketemu solusinya.
Ane berpikir seperti ini:
Tidak perlu join beberapa tabel di awal. Select dari "myproyek". Dari loop hasilnya, select join "proyek_detil", jika row setiap "proyek_id" lebih dari satu, bandingkan datetime, dan lakukan average jika "nilai" punya value berbeda
Tapi Select dalam loop tidak direkomendasikan. Apalagi akan banyak eksekusi fungsi dalam loop utk mencari tanggal terdekat/terjauh dan average.
Ada solusi gan suhu?
Ane punya tabel hasilnya seperti ini:
![[ASK] PDO - MYSQL Gabungkan row dengan Datetime dan Average](https://s.kaskus.id/images/2016/08/08/7729600_20160808031230.jpg)
Itu hasil di tabel pertama adalah Join 3 tabel:
Tabel induk:
myproyek
columns: proyek_id, proyek_nama
Tabel Detail:
proyek_detil
columns: detil_id,proyek_id, nilai, buyer_id, st_proyek,end_proyek,status
Tabel Klien:
mybuyer
columns: buyer_id, nama_buyer
PDO Join tabel
Code:
public function joinProyekX($status)
{
$this->xconn();
try{
$stmt = $this->db->prepare("SELECT * FROM proyek_detil JOIN myproyek ON myproyek.proyek_id = proyek_detil.proyek_id LEFT OUTER JOIN mybuyer ON proyek_detil.buyer_id= mybuyer.buyer_id WHERE myproyek.status != :st ORDER BY proyek_detil.proyek_id");
$stmt->bindParam(':st', $status);
$stmt->execute();
return $stmt->fetchAll(PDO::FETCH_ASSOC);
}
catch (PDOException $e){
}
}
PHP untuk view
Code:
$arraydata = $classdb->joinProyekX('canceled'); //status: done, pending, canceled
//tabel head untuk Datatables
$str = '';
$no = 0;
foreach ($arraydata as $r) {
$no++;
$str .= '<tr><td>'.$no.'</td>
<td>'.$r[proyek_nama'].'</td>
<td>'.$r['nilai'].'</td>
<td>'.$r['nama_buyer'].'</td>
<td>'.$r['st_proyek'].'</td>
<td>'.$r['end_proyek'].'</td></tr>';
}
echo $str;
Ane pengen proyek yang sama digabungkan menjadi 1 row saja dengan prinsip:
- Grup berdasarkan nama proyek (dari "proyek_id", primary key)
- untuk "Start" , skip null atau empty, pilih tgl yang paling awal ("st_proyek", datetime) -> Pada proyek A, start paling awal 3 Jan 2016
- untuk "End" , skip null atau empty, pilih tgl yang paling akhir ("end_proyek", datetime) -> Pada proyek A, akhir terdekat 29 Jan 2016
- untuk "Nilai", skip null atau empty, average dari bbrp row yang punya nilai. Contoh di atas-> (400.000+420.000)/2 hasilnya 410.000
Gambarannya yang diinginkan seperti ini
![[ASK] PDO - MYSQL Gabungkan row dengan Datetime dan Average](https://s.kaskus.id/images/2016/08/08/7729600_20160808031248.jpg)
Memakai "GROUP BY proyek_detil.proyek_id" memang akan menggrup proyek, tapi tetap saja masih perlu filter berdasarkan tanggal terdekat/terjauh lalu melakukan average. Nah ini ane belum ketemu solusinya.
Ane berpikir seperti ini:
Tidak perlu join beberapa tabel di awal. Select dari "myproyek". Dari loop hasilnya, select join "proyek_detil", jika row setiap "proyek_id" lebih dari satu, bandingkan datetime, dan lakukan average jika "nilai" punya value berbeda
Tapi Select dalam loop tidak direkomendasikan. Apalagi akan banyak eksekusi fungsi dalam loop utk mencari tanggal terdekat/terjauh dan average.
Ada solusi gan suhu?
Diubah oleh smartparents 08-08-2016 15:49
0
806
2


Komentar yang asik ya
Urutan
Terbaru
Terlama


Komentar yang asik ya
Komunitas Pilihan