Výběr nejvyšší verze projektu se statusem 3

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

Ahojte, potřeboval bych pomoct s SQL dotazem. Vůbec si s ním nevím rady.
Jde o to, že si uživatel může vytvořit projekt, který může vracet až o 3 verze dozadu. Projekt obsahuje jen jednoduchý text.
Mám 2 tabulky
project:

id content owner description created_at

project_version

id version status description content project created_at

sloupec project obsahuje cizí klíč na tabulku project ⇒ project má vazbu OneHasMany na project_version

Verze mají určitý status, díky kterému se následně vypisují. Potřeboval bych vypsat verzi s nejvyšším atributem version a statusem 3 .
Dám příklad

  • verze 1 má status 3
  • verze 2 má status 3
  • verze 3 má status 2

Tudíž dotaz vybere verzi 2, protože má nejvišší version a má status 3 :)
Projekt může mít pouze 4 verze. Jakmile se uživatel pokusí přidat 5. tak se 1. smaže.
Já si to pak přepíšu do Kdyby Doctrine, ale myslím, že na vysvětlení to bude lepší odpovědět v SQL
Díky moc!

Editoval Honza Florián (28. 10. 2017 10:49)

CZechBoY
Člen | 3608
+
0
-
where status=3 order by version desc limit 1
Honza Florián
Člen | 7
+
0
-

Jejda :D asi jsem to špatně vysvětlil. Potřeboval bych, aby se mě vybrala pouze 1 verze od každého projektu. S tím že by se měli objevovat verze řazené podle created_at od nejnovějších ale vzhledem ke všem verzím a né vzhledem k verzím toho projektu.

CZechBoY
Člen | 3608
+
0
-

Moc to nechapu… Chces teda jednu verzi nebo vsechny?
Sekundarni razeni si klidne pridej…

Honza Florián
Člen | 7
+
0
-

Jenu poslední verzi v od každého projektu. Ale jinak chci udělat přehled těchto verzí, takže jich bude celkově víc, akorát tam bude třeba verze 3 od projektu x, pak verze 2 od projektu y, atd …

Editoval Honza Florián (28. 10. 2017 12:22)

CZechBoY
Člen | 3608
+
0
-

A s cim mas teda problem? Zjistit verzi u jednoho projektu nebo u vsech v jednom dotazu?

Honza Florián
Člen | 7
+
0
-

Mám to zapsané následovně:

$projects = $this->em->createQuery('
    SELECT PARTIAL p.{id, name, route}
    FROM App\Model\Entities\Project p
    INNER JOIN p.versions v
    WHERE v.status = ' . ProjectVersion::STATUS_AVALIABLE . '
    GROUP BY v.project
')
    ->setMaxResults(10)
    ->getResult();
$versions = $this->em->createQuery('
    SELECT PARTIAL v.{id, version, description}
    FROM App\Model\Entities\ProjectVersion v
    WHERE v.project IN (:projects)
    GROUP BY V.project
')
    ->setParameter('projects', $projects)
    ->getResult();

První dotaz vrátí projekty, ve kterých je aspoň 1 verze se statusem 3.
V druhém dotazu se snažím o to vybrat ke každému projektu jednu verzi, která má status 3 a které jsou řazeny dle verze. Verze by se měli řadit u každého projektu zvlášť.
Ale radši bych byl, kdyby se to dalo řešit v jednom dotazu.

Editoval Honza Florián (28. 10. 2017 13:14)

romankubis
Člen | 1
+
0
-

Skus pouzit GROUP_CONCAT a v nom ORDER BY a daj nejaky SEPARATOR. Potom na prvej pozicii bude ta verzia.