【问题标题】:How to combine columns from join table results?如何组合连接表结果中的列?
【发布时间】:2015-08-30 11:16:18
【问题描述】:

我有一个如下所示的 mysql 表:

表支付类​​型

ID   PaymentCode   PaymentName
1      P1        CASH
2      P2        TRANSFER
3      P3        CREDIT CARD

餐桌人

ID   ID_PERSON   PersonName
1      123        GEORGE
2      124        HENRY
3      125        MICHAEL
4      126        ANNA

表 INVOICE_IN

ID   ID_INVOICE_IN   Person_ID  Amount PaymentType_ID
1      II-001            1       100      1
2      II-002            2       200      1
3      II-003            4       300      2

表 INVOICE_OUT

ID   ID_INVOICE_OUT   Person_ID  Amount     PaymentType_ID
1      IO-001                 1       500      2
1      IO-002                 3       600      3

我想要这样的结果:

ID_INVOICE_IN PaymentCode  PersonName  Amount ID_INVOICE_OUT PaymentCode  PersonName  Amount
II-001            P1         George     100        IO-001     P2          George      500 
II-002            P1         Henry      200        IO-002     P3       Michael       600 
II-003            P2         Anna       300         NULL      NULL       NULL      NULL

我有一个这样的查询:

SELECT INVOICE_IN.ID_INVOICE_IN, PaymentType.PaymentCode, PERSONS.PersonName, INVOICE_IN.Amount FROM INVOICE_IN LEFT JOIN PaymentType ON PaymentType.id = INVOICE_IN.PaymentType_ID LEFT JOIN PERSONS ON PERSONS.id = INVOICE_IN.Person_ID

查询成功显示 invoice_in 的 4 列。

我也有这样的查询:

SELECT INVOICE_OUT.ID_INVOICE_OUT, PaymentType.PaymentCode, PERSONS.PersonName, INVOICE_OUT.Amount FROM INVOICE_OUT LEFT JOIN PaymentType ON PaymentType.id = INVOICE_OUT.PaymentType_ID LEFT JOIN PERSONS ON PERSONS.id = INVOICE_OUT.Person_ID

查询成功显示 4 列 invoice_out

我需要在result1(invoice_in)和result2(invoice_out)之间合并,所以查询的结果有8列。

【问题讨论】:

  • 是的,有可能,这实际上是MySQL正在做的并且擅长的。到目前为止你做了什么?
  • 到目前为止,我只显示了一个表格,我需要像结果一样组合两个表格。所以我的意思是,连接表(invoice_in)结合(invoice_out),结果更多列(如上面的结果),结果不在行中
  • 您的表结构是规范化的,并与 ID 连接。你只需要在上面做一个简单的SELECT 和几个JOIN 子句来粘合其余的数据,没什么太难的。
  • 是的,使用连接语法,但我只对一张表成功。但是如何像上面的结果一样将join 1的结果组合成结果join 2。
  • @ed.inside 您可以编辑您的问题。最好把代码放在那里,有些人不看cmets。

标签: mysql database select join


【解决方案1】:

如果我的理解正确,您似乎想要做的是显示彼此相邻的不相关数据集。

一种方法是对每个集合中的行进行编号,然后将较大的集合作为左侧进行左连接。 (更好的方法是使用full outer join,但 MySQL 不支持,尽管使用带联合的左/右连接可以实现相同的效果)。在 MySQL 中,您可以使用用户变量对行进行编号。

此查询给出了您的示例的结果,尽管我并没有真正看到并排显示不相关数据的意义。 (如果它真的不相关......问题中没有任何内容表明它是相关的)。

select 
  t1.id_invoice_in, t1.paymentcode, t1.personname, t1.amount,
  t2.id_invoice_out, t2.paymentcode, t2.personname, t2.amount  
from (
  select     
    id_invoice_in, paymentcode, personname, amount,
    (@r1 := @r1 + 1) as r1
  from invoice_in 
  join paymenttype pt on pt.id = paymenttype_id 
  join persons p on p.id = person_id
  ,(select @r1 := 0) r
) t1 left join (
  select 
    id_invoice_out, paymentcode, personname, amount,
    (@r2 := @r2 + 1) as r2
  from invoice_out 
  join paymenttype pt on pt.id = paymenttype_id 
  join persons p on p.id = person_id
  ,(select @r2 := 0) r
) t2 on t1.r1 = t2.r2;

Sample SQL Fiddle

【讨论】:

  • 非常感谢。你很聪明!这个查询我以前从未见过/知道。谢谢你的帮助。问题解决了!
  • @ed.inside 乐于助人:)
  • 您的查询可以正常工作。但我如何在 vb.net 中使用您的查询?我已经尝试在 vb.net 中编写您的查询,并且出现错误“命令执行期间遇到致命错误”。我想也许查询包含@。如何在不输入参数添加值的情况下只执行查询。如果一定要这样输入值:myCMD.Parameters.AddWithValue("r", whatisvalue??)。
  • @ed.inside 恐怕我无法回答这个问题,因为我从未使用过 VB.Net。我猜你需要以某种方式转义符号,但我不知道,抱歉。
【解决方案2】:
SELECT 
    `In`.`ID_INVOICE_IN`, 
    `PayI`.`PaymentCode`, 
    `PersI`.`PersonName`, 
    `In`.`Amount`, 
    `Out`.`ID_INVOICE_OUT`, 
    `PayO`.`PaymentCode`, 
    `PersI`.`PersonName`, 
    `Out`.`Amount` 
FROM
    `INVOICE_IN`  AS `In`,
    `INVOICE_OUT` AS `Out`,
    `PERSONS`     AS `PersI`,
    `PERSONS`     AS `PersO`,
    `PaymentType` AS `PayI`,
    `PaymentType` AS `PayO`
WHERE
    `In`.`ID`              = `Out`.`ID`   AND
    `In`.`Person_ID`       = `PersI`.`ID` AND
    `Out`.`Person_ID`      = `PersO`.`ID` AND
    `In`.`PaymentCode_ID`  = `PayI`.`ID`  AND
    `Out`.`PaymentCode_ID` = `PayO`.`ID`
ORDER BY
    `In`.`ID_INVOICE_IN`

【讨论】:

  • 我认为我们不应该在 21 世纪的问答论坛中提倡 20 世纪的加入语法
  • @Strawberry:有错吗?不,它对执行有影响吗?不。(事实上,许多数据库机器内部将 JOIN 语法转换成看起来像我写的东西。)容易理解吗?是的!
  • 除了使用 pre-SQL92 连接之外,这个答案不会产生所需的输出,因为解决方案必须使用外连接。
  • @Hubert Schölnast,我已经尝试过您的查询,但没有结果(MySQL 返回了一个空结果集(即零行)。(查询耗时 0.0010 秒)
  • 谁能帮助我?
猜你喜欢
  • 2021-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多