Php MySQL Fetch在单个查询中连接多个具有多行的表 表A 表B 表C

Php MySQL Fetch在单个查询中连接多个具有多行的表 表A 表B 表C,php,mysql,sql,database,Php,Mysql,Sql,Database,大家好 我想从表A中获取所有行,如果请求的用户I.e 1001在表C中有任何条目,那么相应的值即bid_price应该返回other wise bidprice应该为空 对于给定的UID 1001,这将是预期结果 A.C_ID | A.C_NAME| B.C_PRICE_1 | B.C_PRICE_2 | C.C_BID_PRICE_1 | C.C_BID_PRICE_2 -------+---------+--------------+-------------+-------

大家好

我想从表A中获取所有行,如果请求的用户I.e 1001在表C中有任何条目,那么相应的值即bid_price应该返回other wise bidprice应该为空

对于给定的UID 1001,这将是预期结果

   A.C_ID | A.C_NAME| B.C_PRICE_1  | B.C_PRICE_2 | C.C_BID_PRICE_1 | C.C_BID_PRICE_2
    -------+---------+--------------+-------------+-----------------+---------------
100        |ABC      |10            |25           |20               | null
101        |EFG      |32            |22           |null             | 40
102        |HIJ      |10            |25           |50               |100

其中,B.C_价格1是B.Type=1,B.C_价格2是B.Type=2,以下是您想要的吗

SELECT A.C_ID,A.C_NAME,B.TYPE,B.PRICE,C.BID_PRICE
FROM TABLE_A A, TABLE_B B, TABLE_C C
WHERE A.C_ID = B.CID AND B.CID = C.CID
AND C.UOD = {yourUID};

如果您正在寻找以下结果,请尝试此解决方案

下面是查询,您可以使用

SELECT 
    a.C_ID, 
    a.C_NAME, 
    SUM(CASE WHEN b.TYPE = 1 THEN b.PRICE END) C_PRICE_1, 
    SUM(CASE WHEN b.TYPE = 2 THEN b.PRICE END) C_PRICE_2,
    SUM(CASE WHEN c.TYPE = 1 THEN c.BID_PRICE END) C_BID_PRICE_1, 
    SUM(CASE WHEN c.TYPE = 2 THEN c.BID_PRICE END) C_BID_PRICE_2 
FROM tableA a
 JOIN tableB b 
  ON a.C_ID = b.CID
 LEFT JOIN tableC c 
  ON a.C_ID = c.CID 
   AND b.TYPE = c.TYPE
   AND c.UID = 1001
GROUP BY a.C_ID, a.C_NAME;
你可以试试这个


希望这对您有所帮助。

只需将表b和表c连接两次:

select 
  a.c_id, 
  a.c_name, 
  b1.price as c_price_1,
  b2.price as c_price_2,
  c1.bid_price as c_bid_price_1,
  c2.bid_price as c_bid_price_2
from a
left join (select * from b where type = 1) b1 on b1.cid =  a.c_id
left join (select * from b where type = 2) b2 on b2.cid =  a.c_id
left join (select * from c where type = 1) c1 on c1.cid =  a.c_id
left join (select * from c where type = 2) c2 on c2.cid =  a.c_id;


A.C\U ID应该是不同的,所以您想要具有多个C.BID\U价格的不同A.C\U ID?这是不可能的。根据您的说明,表A和表B之间似乎存在一对多关系,因为表B包含多个CID,是否要从表B中获取最小值的最大值,以及表C中的最小值?我希望表B和表C行作为相应类型“1”和“2”的冒号。如果您从示例数据中提供预期数据,则会很清楚。该类型似乎不太可能出现在两个表中-尽管我们当然不知道“类型”是什么is@Strawberry 类型将为1和2。这可能是一个显示问题的重复-通常最好在应用程序代码中解决。您在哪里传递UID?SUM将表B中的所有值相加。预期结果中没有UID。我在SUM函数中使用case语句,因此,只有当满足从表A获取所有行的条件时,SUM才会发生,如果请求的用户在表C中有任何条目,则相应的值[bid_price]应该返回其他值bidprice应该为null是的,这就是上述查询的工作方式。如果您注意到,对于CID=100,TYPE=2没有记录,因此C_BID_PRICE_2列有null@alanabraham我也用UserId过滤器更新了我的答案。我应该在哪里传递UID?选择a.id,a.heading,b1.share作为c_price_1,b2.share作为c_price_2,c1.points作为c_bid_price_1,c2.点为c_bid_price_2,从新闻作为左键加入b1.newsId=a.id和b1.type=4左键加入b2.newsId=a.id和b2.type=5左键加入c1.cid=a.id和c1.by_earn=4和c1.userId=1001左键加入c2.cid=a.id和c2.by_earn=5和c2.userId=1001订单方a、 id Limit 50它花费了太多的时间,并且它给出了以下错误:在查询过程中失去了与MySQL服务器的连接。您应该有适当的索引。我建议:newsid,heading,jk_newsbughtnewsid,type,share和tbl_walletcid,userId,by_earn,points。这些是复合覆盖索引,应该可以使您的查询非常快速。
SELECT A.C_ID,A.C_NAME,B.TYPE,B.PRICE,C.BID_PRICE
FROM TABLE_A A, TABLE_B B, TABLE_C C
WHERE A.C_ID = B.CID AND B.CID = C.CID
AND C.UOD = {yourUID};
SELECT 
    a.C_ID, 
    a.C_NAME, 
    SUM(CASE WHEN b.TYPE = 1 THEN b.PRICE END) C_PRICE_1, 
    SUM(CASE WHEN b.TYPE = 2 THEN b.PRICE END) C_PRICE_2,
    SUM(CASE WHEN c.TYPE = 1 THEN c.BID_PRICE END) C_BID_PRICE_1, 
    SUM(CASE WHEN c.TYPE = 2 THEN c.BID_PRICE END) C_BID_PRICE_2 
FROM tableA a
 JOIN tableB b 
  ON a.C_ID = b.CID
 LEFT JOIN tableC c 
  ON a.C_ID = c.CID 
   AND b.TYPE = c.TYPE
   AND c.UID = 1001
GROUP BY a.C_ID, a.C_NAME;
select 
  a.c_id, 
  a.c_name, 
  b1.price as c_price_1,
  b2.price as c_price_2,
  c1.bid_price as c_bid_price_1,
  c2.bid_price as c_bid_price_2
from a
left join (select * from b where type = 1) b1 on b1.cid =  a.c_id
left join (select * from b where type = 2) b2 on b2.cid =  a.c_id
left join (select * from c where type = 1) c1 on c1.cid =  a.c_id
left join (select * from c where type = 2) c2 on c2.cid =  a.c_id;
select 
  a.c_id, 
  a.c_name, 
  b1.price as c_price_1,
  b2.price as c_price_2,
  c1.bid_price as c_bid_price_1,
  c2.bid_price as c_bid_price_2
from a
left join b b1 on b1.cid =  a.c_id and b1.type = 1
left join b b2 on b2.cid =  a.c_id and b2.type = 2
left join c c1 on c1.cid =  a.c_id and c1.type = 1
left join c c2 on c2.cid =  a.c_id and c2.type = 2;