Různý počet výsledků dotazu

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
barbucha
Člen | 11
+
0
-

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

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

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

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)