Trochu komplikovanejsi database SELECT
- tolljump
- Člen | 47
Zdravim vas.
Prosim, bude mi vediet niekto pomoct vyskladat dotaz cez Nette Database,
podla toho co z neho potrebujem?
Najskor aktualny select:
$select = $this->database->table('driving')->where(array(
'car_id' => $carId
))->where("DATE(start_time) = ?", $d);
$select->where('driving.status <> 0');
// $select->where(':drive_participants.payment.set_highlight','1');
$select->select("driving.*, (SELECT COUNT(id) FROM drive_participants WHERE drive_id = driving.id AND great_tour = '1') AS greattour_discounts, "
// . ":drive_participants.payment.set_highlight AS payment_highlight, "
// . "(SELECT COUNT(id) FROM drive_participants LEFT JOIN payments ON payments.id = drive_participants.payment_id "
// . " WHERE drive_participants.drive_id = driving.id AND payments.set_highlight = '1') "
// . "AS payment_highlight, "
. "start_point.short_name AS start_point_short_name, end_point.short_name AS end_point_short_name, "
. "start_point.name AS start_point_name, end_point.name AS end_point_name, "
. "users.real_name AS user_real_name, users.travel_agent.name AS travel_agent_name");
$select->order('start_time');
V principe, co tento skript robi:
Vybera vsetky jazdy z tabulky „driving“, ktore maju status = 0, start_time
= ?, atd. atd.
Pripajam k tomu pomocou cudzich klucov nejake data z dalsich tabuliek.
Jednoducho, je to vyber zoznamu jazd s informaciami o nich.
K jazdam sa v dalsej tabulke „drive_participants“ nachadza N zaznamov
o rezervaciach v danych jazdach. Cize jeden zaznam v „driving“ moze mat N
zaznamov v „drive_participants“.
Nasledne vsetky tieto rezervacie (v „drive_participants“) su pomocou
cudzieho kluca napojene na tabulku „payments“ pomocou stlpca
„payment_id“.
A nakoniec, v tabulke „payments“ mam stlpec „set_highlight“, ktoremu
nastavujem 1 alebo 0.
OTAZKA:
Ako upravit select tak, aby zistoval, kolko rezervacii (alebo
ci nejaka aspon jedna rezervacia) ma nastaveny taky „payment_id“, ktory ma
„set_highlight“ nastaveny na „1“ ???
Aby som to laicky upresnil… Potrebujem zistit, ci sa v danej jazde nachadza aspon jedna rezervacia, ktora ma zvolenu platbu, ktora ma atribut „set_highlight“ na = „1“.
Dobre? :-D
Budem velmi vdacny tomu, kto to tu aspon pochopi a skusi nieco navrhnut.
PS: tie zakomentovane kody som tam nechal len preto, aby ste videli moje myslienkove pochody, co som uz skusal… Ani jedno z toho nieje to co potrebujem…
- Petr Hudík
- Člen | 49
Z pragmatického hlediska bych vyzkoušel zcela odlišný přístup.
Nesnažil bych se dostat všechny sloupce do jednoho dotazu, ale vytáhl bych
podstatně jednodušším dotazem jízdy (z tabulky driving
) a
poté bych něco podobného:
<?php
foreach ($driving as $drive) {
$participantsCount = count($drive->related('drive_participants')->where('great_tour', TRUE));
}
?>
Od tohoto nápadu bych se zkusil odpíchnout. (psáno z hlavy, snad tam
není nějaká bota) Je samozřejmě otázkou, jak dále naložit s proměnou
$participantsCount
– zda ji jen vypsat, nebo někam uložit.
Editoval Petr Hudík (17. 1. 2015 8:32)
- tolljump
- Člen | 47
Ahoj Petr.
Dakujem za tvoj napad, no neviem ci by bol v nasom pripade najstastnejsim
riesenim, pretoze tych jazd moze byt niekolko stoviek, ktore treba vykreslit
naraz. Preto by som nebol velmi za riesenie, ktore nam vytvori stovky SQL
dotazov len kvoli vyberu jazd pre dane auto.
Najradsej by som to spojil do nejakeho jedneho SQL dotazu.
Ak vsak mas nejako dokazane, ze vytvorit radsej stovky SQL dotazov je rychlejsie
ako jeden nejaky komplikovany SQL dotaz, tak urcite to prerobim na tento
sposob.