Ako správne limitnuť LEFT JOINOVANÚ tabulky v nette context

KristianSubweb
Člen | 144
+
0
-

Ahoj potreboval by som pomocť má Select kde left joinujem dalšiu tabulku. Len problém je v tom že left join tým že vracia viac zaznamov tak mi to prirodzene navyšuje fatch mojich dát.

$testPlanSprintCase = $this->database->table("test_plan_sprint_case")
            ->select("*, :test_case_run.starttime AS testDateTime")
            ->where("test_plan_sprint_case.forced_status_id", [2,3])
            ->where("test_plan_sprint_case.test_plan_sprint_id ", $testPlan->getTestSprintIds())
            ->fetchAll();

Neviete poraziť teda ako si to groupnem podla :test_case_run.starttime a limitnem na 1?

Ďakujem

h4kuna
Backer | 740
+
0
-

Zkus sestavit obyčejné sqlko a až ti to bude dávat výsledky, které potřebuješ koukneme na to jak to napsat v nette.

Editoval h4kuna (21. 5. 2019 11:35)

KristianSubweb
Člen | 144
+
0
-

h4kuna napsal(a):

Zkus sestavit obyčejné sqlko a až ti to bude dávat výsledky, které potřebuješ koukneme na to jak to napsat v nette.

Query je takato.

SELECT *, ( SELECT starttime FROM test_case_run WHERE test_plan_sprint_case_id = test_plan_sprint_case.id ORDER
BY starttime DESC LIMIT 1) AS result FROM test_plan_sprint_case WHERE test_plan_sprint_case.forced_status_id IN
(2,3) AND test_plan_sprint_case.test_plan_sprint_id IN (14,15)

Editoval KristianSubweb (21. 5. 2019 14:02)

h4kuna
Backer | 740
+
0
-

No vidíš, tak to nejtěžší máš za sebou, teď už to zvládneš :)

Zformátováno

SELECT *, (
  SELECT starttime
  FROM test_case_run
  WHERE test_plan_sprint_case_id = test_plan_sprint_case.id
  ORDER BY starttime DESC
  LIMIT 1
) AS result
FROM test_plan_sprint_case
WHERE test_plan_sprint_case.forced_status_id IN (2,3)
  AND test_plan_sprint_case.test_plan_sprint_id IN (14,15);

Tak ty dva dotazy samy o sobě jsou jednoduchý na sestavení. Jak se udělá vnořený dotaz to se musím podívat. Dej mi chvilku, třeba to budeš mít rychleji.

h4kuna
Backer | 740
+
0
-

Nedohledal jsem jak se dělá vnořený dotaz a Selection není podporovaný.
Takže je možnost si to sám seskládat ze dvou dotazů.

Kód jsem netestoval.

$sprintCases = $context->table('test_plan_sprint_case')
	->where('forced_status_id', [2, 3])
	->where('test_plan_sprint_id', [14, 15])
	->fetchPairs('id');

$runCases = $context->table('test_case_run')
	->select('starttime, test_plan_sprint_case_id')
	->where('test_plan_sprint_case_id', array_keys($sprintCases))
	->order('starttime DESC')
	->limit(1);

foreach ($runCases as $runCase) {
	$sprintCases[$runCase->test_plan_sprint_case_id]['starttime'] = $runCase->starttime;
}

Nebo to celé můžeš pustit přímo přes pustit přes database core.

Nicméně v tomto případě bych si pomocí triggeru ukládal poslední test_case_run.id do tabulky test_plan_sprint_case kde bych si udělal sloupeček test_case_run_id a dělal join přes tento sloupeček.

Editoval h4kuna (21. 5. 2019 15:36)

KristianSubweb
Člen | 144
+
+1
-

h4kuna napsal(a):

Nedohledal jsem jak se dělá vnořený dotaz a Selection není podporovaný.
Takže je možnost si to sám seskládat ze dvou dotazů.

Kód jsem netestoval.

$sprintCases = $context->table('test_plan_sprint_case')
	->where('forced_status_id', [2, 3])
	->where('test_plan_sprint_id', [14, 15])
	->fetchPairs('id');

$runCases = $context->table('test_case_run')
	->select('starttime, test_plan_sprint_case_id')
	->where('test_plan_sprint_case_id', array_keys($sprintCases))
	->order('starttime DESC')
	->limit(1);

foreach ($runCases as $runCase) {
	$sprintCases[$runCase->test_plan_sprint_case_id]['starttime'] = $runCase->starttime;
}

Nebo to celé můžeš pustit přímo přes pustit přes database core.

Nicméně v tomto případě bych si pomocí triggeru ukládal poslední test_case_run.id do tabulky test_plan_sprint_case kde bych si udělal sloupeček test_case_run_id a dělal join přes tento sloupeček.

Super diki už to ide :)