JOIN a BETWEEN ze tří tabulek s více parametry
- cestmir
- Člen | 2
Ahoj, potřeboval bych prosím poradit s dotazem do databáze. Pokud mám více parametrů, než jeden, tak to se nemůžu dopracovat k výsledku. Potřebuju, abych si mohl vložit více paramterů, jako $date a v tomto příkladě ještě $group, která by nahradila fixně zadanou hodnotu v dotazu ‚nazev‘. $date obsahuje datum – první den v měsíci, kdy se mění jen měsíc. Datumy v tabulce PERSO jsou vždy od 1. dne nějakého měsíce do posledního dne nějakého měsíce … BETWEEN má vyhodnotit, jestli ten $datum je mezi těmito datumy a tím zobrazit adekvátní hodnoty. Cílem je to ještě rozšiřovat, nejde mi tam zadat více parametrů s ?, i když jsem je dal do pole … funguje to trochu jinak, než přes prepare() a execute(), ale nemůžu nic najít …
tabulky:
KSM
- id
- ksm (int 6-ti místné číslo)
- skupina
USERS
- id
- full_name
PERSO
- id
- user_id
- ksm_id
- datum_od
- datum_do
namespace App\Model\Queries;
use Nette\Database as Dbh; // Database handler
class KsmQueries
{
public function __construct(
private Dbh\Explorer $database
){}
public function getKsmsByGroup(string $date): array
{
$query = "
SELECT ksm.*, users.full_name
FROM ksm
JOIN perso ON ksm.id = perso.ksm_id
JOIN users ON users.id = perso.user_id
WHERE ksm.skupina = 'Název' AND ? BETWEEN perso.datum_od AND perso.datum_do;
";
return $this->database->fetchAll($query, $date);
}
}
všem mockrát děkuji za pomoc a jakýkoliv názor …
Editoval cestmir (4. 2. 9:23)
- zelopx
- Člen | 2
pouzivas Nette Database Core alebo Explorer? podla mna Core.
nemal by si mat potom v konstruktore skor:
public function __construct(
private Dbh\Connection $database
) {
}
a query potom:
return $this->database->query('
SELECT
ksm.*,
users.full_name
FROM ksm
JOIN perso ON perso.ksm_id = ksm.id
JOIN users ON users.id = perso.user_id
WHERE
ksm.skupina = ?
AND
? BETWEEN perso.datum_od AND perso.datum_do
', $group, $date);
alebo:
return $this->database->fetchAll('
SELECT
ksm.*,
users.full_name
FROM ksm
JOIN perso ON perso.ksm_id = ksm.id
JOIN users ON users.id = perso.user_id
WHERE
ksm.skupina = ?
AND
? BETWEEN perso.datum_od AND perso.datum_do
', $group, $date);
Editoval zelopx (5. 2. 14:09)
- cestmir
- Člen | 2
ne, používám Explorer. Pomohlo to první, co jsi mi napsal (než jsi to zřejmě smazal) – měl jsem to otevřený ještě v mobilu … a to:
public function getKsmsByGroup(string $group, string $date): array
{
$query = "
SELECT ksm.*, users.full_name
FROM ksm
JOIN perso ON ksm.id = perso.ksm_id
JOIN users ON users.id = perso.user_id
WHERE ksm.skupina = ? AND ? BETWEEN perso.datum_od AND perso.datum_do;
";
return $this->database->fetchAll($query, $group, $date);
}
mockrát díky