У меня эти таблицы SQL
gouvernorat
id |nom
1 TUNIS
2 ARIANA
3 BEN AROUS
4 MANOUBA
5 NABEUL
delegation
id|id_gouvernorat| nom
1 1 EL MENZAH
2 1 EL HRAIRIA
3 1 EL KABBARIA
22 2 RAOUADE
23 2 SIDI THABET
id_gouvernorat - это внешний ключ gouvernorat
tarifs_zone
zone_a|zone_b|prix
1 2 10
1 3 15
1 4 17
1 5 0
2 3 1
2 4 5
zone_a и zone_b являются внешним ключом делегирования
Я хочу получить Gouvernorat.nom, delegation.nom of zone_a, Gouvernorat.nom, delegation.nom of zone_b и цена без дубликатов (A, B без B, A)
public function Get_zones($start, $length, $order, $dir,$search,$gouvernorat){
$sql='
SELECT (
SELECT delegation.id_gouvernorat
FROM delegation
WHERE tarifs_zones.zone_b=delegation.id)
AS zoneB,
gouvernorat.nom AS gouvernoratA,
gouvernorat.id AS zoneA,
delegation.nom AS delegationA,
tarifs_zones.prix AS prix,
(SELECT gouvernorat.nom
from gouvernorat
WHERE zoneB=gouvernorat.id)
AS gouvernoratB,
(SELECT delegation.nom
FROM delegation
WHERE tarifs_zones.zone_b=delegation.id)
AS delegationB
FROM tarifs_zones
JOIN delegation ON delegation.id = tarifs_zones.zone_a
JOIN gouvernorat ON delegation.id_gouvernorat = gouvernorat.id
HAVING (gouvernoratA= \''.$gouvernorat.'\' OR gouvernoratB= \''.$gouvernorat.'\' OR \'Tous les gouvernorats\'=\''.$gouvernorat.'\')
AND (delegationA LIKE \'%'.$search.'%\' OR gouvernoratA LIKE \'%'.$search.'%\' OR delegationB
LIKE \'%'.$search.'%\' OR gouvernoratB LIKE \'%'.$search.'%\' OR prix LIKE \'%'.$search.'%\')
ORDER BY '.$order.' '.$dir.'
LIMIT '. $start.', '.$length.';
';
return $this->db->query($sql);
}
Это моя функция, но я чувствую, что это слишком сложно, и я не могу найти способ обновить цену всех зон в зависимости от двух gouvernorat.nom
Нет необходимости использовать подзапросы за SELECT
. Вы не должны бояться использовать одну и ту же таблицу дважды в JOIN
s. Вам просто нужно назначать псевдонимы в таких случаях.
Поэтому ваш запрос будет чем-то вроде
SELECT d2.id_gouvernorat AS zoneB,
g1.nom AS gouvernoratA,
g1.id AS zoneA,
d1.nom AS delegationA,
tarifs_zones.prix AS prix,
d2.nom AS gouvernoratB,
d2.nom AS delegationB
FROM tarifs_zones
LEFT JOIN delegation d1 ON d1.id = tarifs_zones.zone_a // delegation with alias d1 for zone_a
LEFT JOIN delegation d2 ON d2.id = tarifs_zones.zone_b // delegation with alias d2 for zone_b
LEFT JOIN gouvernorat g1 ON d1.id_gouvernorat = g1.id
LEFT JOIN gouvernorat g2 ON d2.id_gouvernorat = d2.id
HAVING (gouvernoratA= \''.$gouvernorat.'\' OR gouvernoratB= \''.$gouvernorat.'\' OR \'Tous les gouvernorats\'=\''.$gouvernorat.'\')
AND (delegationA LIKE \'%'.$search.'%\' OR gouvernoratA LIKE \'%'.$search.'%\' OR delegationB
LIKE \'%'.$search.'%\' OR gouvernoratB LIKE \'%'.$search.'%\' OR prix LIKE \'%'.$search.'%\')
ORDER BY '.$order.' '.$dir.'
LIMIT '. $start.', '.$length.';
LEFT JOIN