Různý počet výsledků dotazu
- barbucha
- Člen | 11
Tvořím dotaz pomocí rozhraní Nette\Database.
Dotaz je poměrně složitý s několika joiny.
Laděnka mi jako jeho výsledek vypíše sql
SELECT "person".*, "club"."name" AS "club_name", "team"."name" AS "team_name", "role"."name" AS
"role_name"
FROM "person"
LEFT JOIN "public"."club_person" AS "club_person" ON "person"."id" = "club_person"."person_id"
LEFT JOIN "public"."club" AS "club" ON "club_person"."club_id" = "club"."id"
LEFT JOIN "public"."squad_person" AS "squad_person" ON "person"."id" = "squad_person"."person_id"
LEFT JOIN "public"."squad" AS "squad" ON "squad_person"."squad_id" = "squad"."id"
LEFT JOIN "public"."team" AS "team" ON "squad"."team_id" = "team"."id"
LEFT JOIN "public"."role" AS "role" ON "squad_person"."role_id" = "role"."id"
WHERE ("person"."valid" = 1) AND ("club"."federation_id" = 1) AND ("squad"."season_id" IS NULL OR
"squad"."season_id" = 1) AND (("lastname" ILIKE 'fanta' OR "firstname" ILIKE 'fanta' OR
unaccent("firstname") ILIKE 'fanta' OR unaccent("lastname") ILIKE 'fanta' )) AND
("club_person"."role_id" IN (8))
Problémem je, že tento dotaz při provedení přímo v db vrací
3 výsledky,
ale v aplikaci pouze jeden.
Pokud nahradím tvoření dotazu pomocí Nette\Database přímo zadáním tohoto dotazu a jeho provedením pomocí
$this->database->queryArgs($sql, []);
dostanu správně 3 výsledky.
- norbe
- Backer | 408
Jde o to, že vycházíš z tabulky person. Pokud používáš $database->table() tak pro každý řádek tabulky je vždy jen jeden řádek výsledku (ostatní se zahodí). Podle toho co přesně potřebuješ, budeš muset vyjít ze správné „počáteční“ tabulky..
Napiš co přesně potřebuješ, pak už ti určitě někdo poradí jak dotaz správně poskládat.
- barbucha
- Člen | 11
norbe napsal(a):
Jde o to, že vycházíš z tabulky person. Pokud používáš $database->table() tak pro každý řádek tabulky je vždy jen jeden řádek výsledku (ostatní se zahodí). Podle toho co přesně potřebuješ, budeš muset vyjít ze správné „počáteční“ tabulky..
Napiš co přesně potřebuješ, pak už ti určitě někdo poradí jak dotaz správně poskládat.
Díky za odpověď, ale to je přesně to co nechápu, proč a kdy se to
děje.
Pokud utvořím dotaz pomocí Nette\Database. Poté zavolám funkci getSQL a
toto SQL provedu, dostávám jiný počet výsledků, než při přímém
provedení.
Proč Nette\Databáze něco ubírá a výsledek redukuje, navíc výsledek
redukuje pokaždé jinak.
Například v mém dotazu dostávám náhodně různé výsledky ve sloupci
team.name a role.name.
Bohužel ani rada, abych vyšel z jiné tabulky v tomto případě nefunguje, neboť pro některé osoby (person), není v tabulkách squad_person (která zmnožuje výsledky pro jednu person) záznam a tyto osoby by tak z výsledku vypadly.
Dotaz si samozřejmě umím napsat sám a provést ho pomocí queryArgs, ale tím přicházím o pohodlí variability a usnadnění konstrukce dotazu a podmínek where, která Nette\Database přináší.
- Unlink
- Člen | 298
Hlavný problém vidím v tom, že sa snažíš použiť NDBT nesprávne. Hlavný princíp NDBT je, že selectuješ dáta len z jednej tabuľky a ostatné získavaš pomocou relácii. Pokiaľ ti ten dotaz vráti 3 riadky pre tú istú osobu, tak dva budú zahodené, pretože to je tá istá osoba (ten istý riadok z tabuľky person)