1

Temat: Skomplikowane zapytanie do bazy, jak go wykonać?

Mam takie oto query:

SELECT (
(
ROUND( (
SUM( t1.rate ) / COUNT( t1.id ) ) , 2
)
) * COUNT( t1.id )
) AS ocenaKoncowa, ROUND( (
SUM( t1.rate ) / COUNT( t1.id ) ) , 2
) AS ocenaPostow, COUNT( t1.id ) AS ilePostow, t1.user_id, t2.username AS user
FROM posts t1, users t2
WHERE t1.user_id = t2.id
AND t2.id !=2
AND t2.id !=30
AND t2.id !=109
AND t2.id !=33
AND t1.created >= DATE_SUB( CURDATE( ) , INTERVAL 1 week ) 
GROUP BY t1.user_id
ORDER BY ocenaKoncowa DESC 
LIMIT 0 , 10

Czyli pobieram dane, zaokrąglem je, dzielę, mnożę itd... jak to włożyć w kod cakePHP, macie pomysł?

2

Odp: Skomplikowane zapytanie do bazy, jak go wykonać?

isset napisał/a:

Mam takie oto query:

SELECT (
(
ROUND( (
SUM( t1.rate ) / COUNT( t1.id ) ) , 2
)
) * COUNT( t1.id )
) AS ocenaKoncowa, ROUND( (
SUM( t1.rate ) / COUNT( t1.id ) ) , 2
) AS ocenaPostow, COUNT( t1.id ) AS ilePostow, t1.user_id, t2.username AS user

To wrzucasz jako "fields"

WHERE t1.user_id = t2.id
AND t2.id !=2
AND t2.id !=30
AND t2.id !=109
AND t2.id !=33
AND t1.created >= DATE_SUB( CURDATE( ) , INTERVAL 1 week ) 

to jako "conditions"

GROUP BY t1.user_id
ORDER BY ocenaKoncowa DESC 
LIMIT 0 , 10

a to jako "group", "order" i "limit"

Czyli z grubsza będzie to wyglądało tak:

$this->Post->find(
   "all",
   array(
     "fields" => array(
        "ROUND( (
             SUM( Post.rate ) / COUNT( Post.id ) ) , 2
          )) * COUNT( Post.id )",
        "ROUND(...)"
      )
     "conditions"=>array(
       //Twoje warunki
     )
     "group" => "...",
     "order" => "...",
     "limit" => "..."
   )
);

3

Odp: Skomplikowane zapytanie do bazy, jak go wykonać?

zawsze mozesz wywolac funkcje "query" z modelu... smile
ale fakt, rozdzielenie jak id02009 pokazal jest "ladniejsze"

4

Odp: Skomplikowane zapytanie do bazy, jak go wykonać?

Nie tylko ładniejsze, ale bardziej poprawne. W specyficznym modelu układając query musiałbyś je budować tak:

"SELECT * FROM `".$this->tablePrefix.$this->table."` As ".$this->name." ..."

Sporo klepania po to, żeby po zmiania na przykład prefixu w configu dla bazy aplikacja się nie posypała. Bez tego też nie będę działać testy jednostkowe. A cały ten sposób budowania query jest znany klasie Model, więc naruszasz zasadę DRY oraz zamiast używać przetestowanej metody frameworka - dublujesz ją (tworzysz nowe miejsce na nowe bugi).