【问题标题】:MySQL Query; Combine two tablesMySQL 查询;合并两个表
【发布时间】:2015-01-31 18:39:36
【问题描述】:

我有两张桌子:Invoice

 id number   date      client end client city   vracht
  1   4271   2014-5-28 ALLIN  STIHO      ZWOLLE 0

Materials

 id number material thickness length width amount price
  1 14271  Ocoume          10   2500  1220    150   2,3
  2 14271  Ocoume          15   2500  1220     60   2,3
  3 14271  Ocoume          18   2500  1220    125   2,3
  4 14271  Ocoume          22   2500  1220     44   2,3
  5 14271  Ocoume          40   2150  1000     72   2,3
  6 14271  Ocoume          18   3100  1530     25   2,3

Invoice 表中是发票。 Materials 表中是属于发票的物料。

我想要的是将具有相同发票编号(表中的编号列)的那些与选择查询结合起来,如下所示:

number date      client end client city   vracht material thickness length width amount price
 14271 2014-5-28 ALLIN  STIHO      ZWOLLE      0 Ocoume          10   2500  1220    150   2,3
 14271 2014-5-28 ALLIN  STIHO      ZWOLLE      0 Ocoume          15   2500  1220     60   2,3
 14271 2014-5-28 ALLIN  STIHO      ZWOLLE      0 Ocoume          18   2500  1220    125   2,3
 14271 2014-5-28 ALLIN  STIHO      ZWOLLE      0 Ocoume          22   2500  1220     44   2,3
 14271 2014-5-28 ALLIN  STIHO      ZWOLLE      0 Ocoume          40   2150  1000     72   2,3
 14271 2014-5-28 ALLIN  STIHO      ZWOLLE      0 Ocoume          18   3100  1530     25   2,3

这个查询看起来如何?

【问题讨论】:

  • @shree.pat18 如何使用 JOIN?
  • 检查内部连接
  • 这两个表是如何链接的?哪些列?
  • @MZeinstra 您总是可以从文档开始:dev.mysql.com/doc/refman/5.0/en/join.html
  • 有外键关系吗?

标签: mysql select-query


【解决方案1】:
 select * from  invoice, materials where invoice.number=materials.number

建议写下所需的列,而不是*。

【讨论】:

  • 您应该使用 JOIN 关键字以及连接类型而不是这种样式。
  • @shree.pat18 这基本上是inner join,如果你想写inner join这个词,就像.. select * from invoice inner join materials on invoice.number=materials.number
  • 有一个字符拼写错误,但该网站需要至少 6 个字符的编辑。嘘!
【解决方案2】:

您可以使用 JOIN 从两个表中检索列。

示例:

SELECT *
FROM
    Invoice AS i,
    Materials AS m,
WHERE
    m.number = i.number
    AND
    m.number = 14271

【讨论】:

  • @DanyalSandeelo:读过这个问题吗?从表 3 中,我没有看到除 14271 之外的任何其他数字。
  • 这是一个值得争论的愚蠢话题。 OP 没有要求提供所有记录。这是一个足够简单的查询,可以理解和修改。
【解决方案3】:

您可以使用连接。

  SELECT * FROM Material as M LEFT JOIN Invoice as I ON I.number=M.Number

【讨论】:

    【解决方案4】:

    如前所述,如果您有外键关系,您可以使用 JOIN. 这应该会给您想要的结果。

    你可以使用:

    Select "columns you need " or "* "from invoice, materials 
    WHERE invoice.number = material.number
    

    【讨论】:

    • 这不是 UNION 的工作方式。 UNION 将组合结果集,即 Set 1 后跟 Set 2。它不会将 Set 2 中的列附加到 Set 1 的列,这是 OP 想要的。
    • 没有。看看这个:stackoverflow.com/questions/905379/…
    【解决方案5】:
    select 
        `f`.`number`,
        `f`.`client`, 
        `f`.`eind_client`, 
        `f`.`city`, 
        `f`.`vracht`,
            `m`.`material`, 
            `m`.`thickness`, 
            `m`.`length`, 
            `m`.`width`, 
            `m`.`amount`, 
            `m`.`price`
    from 
         `invoice` as `f` 
    right outer join 
         `materials` as `m`
    on 
        `f`.`number`=`m`.`number`
    

    【讨论】:

    • 这很好用,但并不完美。materials 的每条记录都显示了 6 次。你知道如何解决这个问题吗?
    • 也许尝试使用左(或右)外连接代替加入。
    • 好的,正确的加入工作.. 我还添加了 group by,所以如果你接受我的编辑,我可以接受你的回答 :)
    • 抱歉,这个编辑有误。我不需要 Group by.. 请接受我的编辑 :)
    猜你喜欢
    • 1970-01-01
    • 2013-11-22
    • 2013-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-02
    • 1970-01-01
    • 2022-08-04
    相关资源
    最近更新 更多