MySQL - 在视图中连接两个表,从一个表中取行并转换为列

时间:2017-10-25 05:03:19

标签: mysql sql

有一个请求表,每个请求都需要两个担保人。因此,我为请求详细信息制作了一个表格,并为保证人详细信息制作了另一个表格。

现在我需要一个包含所有请求和所有保证人姓名的视图,如下所述。

有谁可以帮我解决这个问题..

我需要MySQL代码来创建此输出。 (用于创建PHP页面)

这些是我的表格。

table tblReq

|-------------------------------------------|  
| ReqID    | ReqAmount     | ReqDate        |
|-------------------------------------------|
| 1001     | 25000         | 2017-10-21     |
| 1002     | 21000         | 2017-10-10     |
| 1003     | 28000         | 2017-10-15     |
| 1004     | 20000         | 2017-10-22     |
|-------------------------------------------|  

table tblGuarantors

|------------------------------------------|  
| G_ID   | ReqID    | G_Name   | G_Contact |
|------------------------------------------|
| 10001  | 1001     | Ramu     | 123456    |
| 10002  | 1001     | Deepu    | 123456    |
| 10003  | 1002     | Mary     | 123456    |
| 10004  | 1002     | James    | 123456    |
| 10005  | 1003     | Muhad    | 123456    |
| 10006  | 1003     | Mannu    | 123456    |
|------------------------------------------|

必需输出

|------------------------------------------|
| ReqID | ReqAmount | G1_Name  | G2_Name   |
|------------------------------------------|
| 1001  | 25000     | Ramu     | Deepu     |
| 1002  | 21000     | Mary     | James     |
| 1003  | 28000     | Muhad    | Mannu     |
| 1004  | 20000     | Null     | Null      |
|------------------------------------------|

你能帮助我吗?

我尝试过这个SQL,但它没有像我想的那样工作。

 SELECT 
     r.ReqID, 
     r.ReqAmount, 
     g1.G_Name, 
     g2.G_Name 
 from 
    (tblReq as r LEFT JOIN tblGuarantors as G1 on g1.ReqID = r.ReqID) 
 LEFT JOIN tblGuarantors as G2 on g2.ReqID = r.ReqID

我们将不胜感激。

提前致谢....

3 个答案:

答案 0 :(得分:1)

您可以使用以下查询:

SELECT r.ReqID, r.ReqAmount,
       MIN(G_Name) AS G1_Name,
       MAX(G_Name) AS G2_Name
FROM tblReq AS r
LEFT JOIN tblGuarantors AS g ON r.ReqID = g.ReqID
GROUP BY r.ReqID, r.ReqAmount

如果请求记录只与一个担保人记录相关,则必须修改查询。

Demo here

修改

要从保证人表中获取所有字段,您需要使用其他查询:

SELECT r.ReqID, r.ReqAmount,
       g1.G_ID AS G1_ID, g1.G_Name AS G1_Name,
       g2.G_ID AS G2_ID, g2.G_Name AS G2_Name
FROM tblReq AS r
LEFT JOIN tblGuarantors AS g1 
   ON r.ReqID = g1.ReqID
LEFT JOIN tblGuarantors AS g2 
   ON r.ReqID = g2.ReqID 
WHERE (g1.G_ID < g2.G_ID) OR (g1.G_ID IS NULL)

第一个LEFT JOIN获取具有最小G_ID值的担保人的详细信息,而第二个LEFT_JOIN获取另一个担保人的详细信息。你还需要谓词

g1.G_ID IS NULL

以便返回没有担保人的请求记录。

Demo here

答案 1 :(得分:0)

我在notepade中编写了代码,也许你应该编辑它,但我认为它会有效。抱歉我的英文。

{{1}}

答案 2 :(得分:0)

Try this
 select tblReq.ReqID, tblReq.ReqAmount, MIN(tblGuarantors.G_Name) AS G1_Name, 
        MAX(tblGuarantors.G_Name) AS G2_Name 
 from tblGuarantors 
 left join tblReq on tblReq.ReqID=tblGuarantors.ReqID;