Siema.
Mam 2 tabele: objects i object_votes. Moim zadaniem jest uzyskać ID-ki top dziesięciu obiektów na podstawie ilości głosów (coś ala ranking).
Mam dziwny problem. Otóż, na podstawie zapytania SQL konstruuję zapytanie przez QueryBuilder w Symfony i teraz tak:
- zapytanie "macierzyste", a także to wygenerowane przeze mnie w kodzie (dumpowane poprzez getDQL()) wydaje się dawać podobny rezultat... ale tylko teoretycznie.
- gdy przechodzi do praktyki, oba zapytania dają, lekko różniące się, wyniki.
[SQL]
SELECT o.objectID, COUNT( ov.object_voteID ) AS votes_count
FROM objects AS o
JOIN object_votes AS ov ON o.objectID=ov.objectID
WHERE ov.object_vote_value = 1
GROUP BY o.objectID
ORDER BY COUNT( ov.object_voteID ) DESC
LIMIT 0, 10
;
[output]
+----------+-------------+
| objectID | votes_count |
+----------+-------------+
| 23 | 22 |
| 3 | 13 |
| 24 | 5 |
| 13 | 3 |
| 4 | 3 |
| 8 | 3 |
| 11 | 2 |
| 27 | 2 |
| 26 | 2 |
| 30 | 1 |
+----------+-------------+
10 rows in set (0.10 sec)
Tutaj zapytanie zwróciło TO CO POWINNO.
[DQL]
SELECT o, COUNT(ov.voteID) AS votes_count
FROM AppBundle\Entity\Object o
INNER JOIN AppBundle:ObjectVote ov
WHERE ov.value = :value
GROUP BY o.ID
ORDER BY votes_count DESC
zwraca mi coś w stylu:
+----------+-------------+
| objectID | votes_count |
+----------+-------------+
| 29 | 64 |
| 2 | 64 |
| 39 | 64 |
| 12 | 64 |
| 22 | 64 |
| 32 | 64 |
| 5 | 64 |
| 42 | 64 |
| 15 | 64 |
| 25 | 64 |
+----------+-------------+
I nie mam pojęcia co to za cholerne 64, jak analizuję tabelę z głosami, to za Chiny mi nie wychodzi 64.
Podaję kod generowania zapytania DQL:
$qb = $this->createQueryBuilder('o')
->addSelect('COUNT(ov.voteID) AS votes_count')
->join('AppBundle:ObjectVote', 'ov') //
->where('ov.value = :value')
->groupBy('o.ID') //
->orderBy('votes_count', 'DESC')
// set parameter
->setParameter('value', 1)
;
$q = $qb->getQuery()->setMaxResults(10);
// $dql = $q->getDQL();
// exit(\Doctrine\Common\Util\Debug::dump($dql));
$objects = $q->getResult();
**
Poratujcie swoimi bystrymi oczętami i zobaczcie gdzie mógłby leżeć błąd. Będę wdzięczny, to pierwszy raz, gdy korzystam z DQL-a :)**