首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从3个表中获取数据

从3个表中获取数据
EN

Stack Overflow用户
提问于 2018-01-18 18:45:33
回答 1查看 68关注 0票数 0

我有这些SQL表

代码语言:javascript
复制
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的外键

代码语言:javascript
复制
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是委托的外键

我想检索zone_a的gouvernorat.nom,delegation.nom,zone_b的gouvernorat.nom,delegation.nom和没有重复的价格(A,B,没有B,A)

代码语言:javascript
复制
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更新所有区域的价格

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-01-18 18:58:30

不需要在SELECT后面使用子查询。您不应该害怕在JOIN中使用同一个表两次。在这种情况下,您只需要分配别名。

因此,您的查询将如下所示

代码语言:javascript
复制
 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.';
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48319415

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档