Получить данные из 3 таблиц

0

У меня эти таблицы 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

  • 0
    Забудьте о php сейчас. Вместо этого см. Meta.stackoverflow.com/questions/333952/…
  • 0
    Прочитайте stackoverflow.com/help/mcve, прежде чем задавать следующий вопрос.
Показать ещё 2 комментария
Теги:
codeigniter

1 ответ

1
Лучший ответ

Нет необходимости использовать подзапросы за 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.';
  • 0
    Я думаю, он возвращает 0 строк, потому что в tarif_zones не может быть ни одной строки, такой как AA 5 или BB 5, каждая комбинация zone_a и zone_b уникальна
  • 0
    @HaledDo хорошо, тогда используйте LEFT JOIN
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню