tiny ‘n’ smart
database layer

Odkazy: dibi | API reference

Oznámení

Omlouváme se, provoz fóra byl ukončen

dibi rozkládá složený dotaz na 2 dotazy

před 6 lety

lvq
Člen | 47

Ahoj,
mám menší problém s dibi.
Napíšu složený dotaz, konkrétně:

$this->db
  ->select('*')
  ->from($this->TABLE_prediction)
  ->where('id NOT IN %in', $this->db
    ->select('%n.id_prediction', $this->TABLE_linkRecommendationPrediction)
    ->from($this->TABLE_prediction)
    ->from($this->TABLE_linkRecommendationPrediction)
    ->where('%n.id = %n.id_prediction', $this->TABLE_prediction, $this->TABLE_linkRecommendationPrediction)
    ->fetchAll())
  ->fetchAll();

Tak se mi to rozloží na 2 dotazy:
`SELECT `link_recommendation_prediction.id_prediction
FROM prediction , link_recommendation_prediction
WHERE prediction.id = link_recommendation_prediction.id_prediction``
a
``SELECT *
FROM prediction
WHERE id NOT IN (1, 2, 11)``

Já bych radši jeden. Měl jsem za to, že to bude fungovat podobně jako zde: https://forum.dibiphp.com/…oreny-select

Máte nějaké doporučení, jak to udělat?
Předem díky

Mám nette 2.0.8, dibi 2.0.1 a PHP 5.4

před 6 lety

Milo
Nette Core | 1119

Od oka… na tom vnořeném fluentu nevolej fetchAll().

před 6 lety

lvq
Člen | 47

@**Milo**: To jsem zkoušel. Potom nastane tato chyba:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '0' at line 1

Dotaz potom vypadá takto:

`SELECT *
FROM prediction
WHERE id NOT IN 0`

před 6 lety

Milo
Nette Core | 1119

Ještě změň modifikátor id NOT IN %SQL, protože nepředáváš pole.

Editoval Milo (24. 6. 2013 14:57)

před 6 lety

lvq
Člen | 47

@**Milo**: Díky moc. Funguje to :-)

Kdyby to někdy někdo četl, tak správně to má být takto:

return $this->db
  ->select('*')
  ->from($this->TABLE_prediction)
  ->where('id NOT IN %sql', $this->db
    ->select('%n.id_prediction', $this->TABLE_linkRecommendationPrediction)
    ->from($this->TABLE_prediction)
    ->from($this->TABLE_linkRecommendationPrediction)
    ->where('%n.id = %n.id_prediction', $this->TABLE_prediction, $this->TABLE_linkRecommendationPrediction)
    )
  ->fetchAll();

a přepíše se to na:
`SELECT *
FROM prediction
WHERE id NOT IN (
SELECT link_recommendation_prediction.id_prediction
FROM prediction , link_recommendation_prediction
WHERE prediction.id = link_recommendation_prediction.id_prediction)`

před 6 lety

Milo
Nette Core | 1119

Pro SQL které vylézá z fluentu používej %SQL (upper-case) modifikátor, protože SQL je již oescapované. %sql (lower-case) by se Ti mohlo někdy při složitějších poddotazech chybně oescapovat 2×.

před 6 lety

lvq
Člen | 47

@**Milo**: ok, dobré vědět :-)