Oznámení
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 :-)