JOIN a BETWEEN ze tří tabulek s více parametry

cestmir
Člen | 2
+
0
-

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
+
0
-

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
+
0
-

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