【问题标题】:select the relationship on one to many in two table joined在两个表中选择一对多的关系加入
【发布时间】:2018-03-29 00:36:15
【问题描述】:
a16s            
id  pic     
1   1.jpg       
2   2.jpg       
3   3.jpg       
4   4.jpg       

a16s_like           
id  p_id u_id   approve
1   1       2   0
2   1       1   1
3   1       5   1
4   1       6   1
5   1       7   0
6   2       2   0
7   2       3   0
8   2       1   1
9   4       4   0
10  4       3   1
11  4       2   1


$sql="SELECT A.id, A.pic

(select count(*) from a16s_like B where B.p_id = A.id) AS Ashow, 
(select count(*) from a16s_like B where B.p_id = A.id and B.approve='0') AS Nshow,
(select count(*) from a16s_like B where B.p_id = A.id and B.approve='1') AS Yshow
FROM a16s A  ORDER BY id DESC";

我用了3次approvic colume,有什么方法可以说服seach吗? 我的目的是

当 u_id=2 执行 select 时,我想得到

id pic    Ashowocunt  approve_0_count  approve_1_count     u_id2_approve   
1  1.jpg   5          2                3                   0
2  2.jpg   3          2                1                   0
3  3.jpg   0          0                0                   null
4. 4.jpg   3          0                3                   0

u_id=3

id pic    Ashowocunt  approve_0_count  approve_1_count     u_id3_approve   
1  1.jpg   0          0                0                   null
2  2.jpg   0          1                0                   0
3  3.jpg   0          0                0                   null
4. 4.jpg   1          0                1                   1    

需要显示变量 u_id 的所有 a.id,就像 u_id=2 或 u_id=3(有 null)

【问题讨论】:

  • 我看到了您的预期结果。我编辑我的答案。
  • 感谢您的帮助。效果很好!我喜欢这段代码!
  • 不客气,对不起,我第一次阅读时误解了您的问题。

标签: mysql sql select count


【解决方案1】:

你可以试试这个。

使用CASE express 和FULL OUTER JOIN

但是Mysql不支持FULL OUTER JOIN,所以需要使用LEFT JOINRight JOIN来实现。

SELECT 
    A.id, 
    A.PIC, 
    SUM(CASE WHEN  B.approve IS NULL THEN 0 ELSE 1 END) AS Ashowocunt,
    SUM(CASE WHEN  B.approve=0 THEN 1 ELSE 0 END) AS Nshow,
    SUM(CASE WHEN  B.approve=1 THEN 1 ELSE 0 END) AS Yshow
FROM  
(
  SELECT A.id ID
  FROM  a16s AS A
  LEFT JOIN a16s_like  AS B ON A.ID = B.p_id 
  UNION 
  SELECT B.p_id ID
  FROM  a16s AS A
  RIGHT JOIN a16s_like  AS B ON A.ID = B.p_id 
) AS T
LEFT JOIN a16s AS A ON A.ID = T.ID
LEFT JOIN a16s_like  AS B ON T.ID = B.p_id 
GROUP BY A.id,A.PIC 

编辑

您可以在a16s_like上使用子查询

SELECT 
    A.id, 
    A.PIC, 
    SUM(CASE WHEN  B.approve IS NULL THEN 0 ELSE 1 END) AS Ashowocunt,
    SUM(CASE WHEN  B.approve=0 THEN 1 ELSE 0 END) AS Nshow,
    SUM(CASE WHEN  B.approve=1 THEN 1 ELSE 0 END) AS Yshow
FROM  
(
  SELECT A.id ID
  FROM  a16s AS A
  LEFT JOIN a16s_like  AS B ON A.ID = B.p_id 
  UNION 
  SELECT B.p_id ID
  FROM  a16s AS A
  RIGHT JOIN a16s_like  AS B ON A.ID = B.p_id 
) AS T
LEFT JOIN a16s AS A ON A.ID = T.ID
LEFT JOIN 
(
SELECT * 
FROM  a16s_like
WHERE u_id=2
)  AS B ON T.ID = B.p_id 
GROUP BY A.id,A.PIC 

您可以通过另一种方式在CASE express 上设置B.approve=1 AND B.u_id=2

SUM(CASE WHEN  B.approve=1 AND B.u_id=2 THEN 1 ELSE 0 END) AS Yshow 

SQLFiddle

【讨论】:

  • 感谢您的帮助。但是我可以在列表中获取所有 A.id,因为某些 A.id 的批准列可能为空。我更清楚地重新确定了我的目的。这个列表可能吗?
  • @robspin 我的新查询可以显示所有a16s.id,如果结果不符合您的预期,您能否提供您预期的结果?
  • 我发现approval状态是p_id的第一位。我可以将 u_id 作为变量发送以找到所选 u_id 的正确批准状态,例如 u_id=2
  • SUM(CASE WHEN B.approve=1 THEN 1 ELSE 0 END where B.u_id=2) AS u_idapprove,我可以把 where 在哪里?它只是猜测,它不能工作。
  • 我编辑了我的答案,这是您的期望吗?您可以创建一个子查询,然后将您的条件放入其中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-11-08
  • 2017-01-24
  • 1970-01-01
  • 1970-01-01
  • 2013-05-14
  • 2014-08-28
  • 1970-01-01
相关资源
最近更新 更多