【问题标题】:One query for two similar tables一个查询两个相似的表
【发布时间】:2013-05-24 19:18:31
【问题描述】:

我有两个具有相同字段的相似表。一个命名为“输入”,另一个命名为“产品”,两者具有相同的字段:

  • 身份证
  • 姓名
  • 数量
  • 单位
  • 价格
  • pic(fk - 两者都引用同一个图片表)。

我的第一个问题是:如何编写查询以有效地返回每个项目的详细信息?

我使用 JSON 来导出这些数据

$json_data.='"rec'.$i.'":{"id":"'.$id.'", "name":"'.$name.'", "price":"'.$price.'", "qty":"'.$qty.'", "units":"'.$unit.'", "pic":"'.$pic.'"},';`. 

我的第二个问题是:如何有效地引用两个表中的所有字段?

注意:我不想将这两个类别放在同一个表中,例如 item,并附加一个字段 category

纠正一下:加入条件是(input.pic=pic.id and product.pic=pic.id)

【问题讨论】:

  • 使用简单的 JOIN 来实现。
  • 为什么会有两个字段相同的表?
  • 它们的结构可能会在以后发生变化,方法是向其中一个添加不同的字段。这就是我保持它们不同的原因。

标签: php mysql ajax json


【解决方案1】:

如果表具有相同的字段,您可以进行联合查询。

 SELECT * FROM table1
 UNION 
 SELECT * FROM table2

如果它们与您所说的相似,那么您只需将它们共同的字段选择到两者中

 SELECT "table1" as source_table,id,name,qty,unit,price from table1
 UNION
 select "table2" as source_table,id,name,qty,unit,price from table2

注意我添加了一个源表,这样你就可以回溯你从哪里得到它......干杯

【讨论】:

    【解决方案2】:

    在 mysql 中使用完整的外部这是不可能的,所以使用/借助联合来获取所有行

    SELECT * FROM input
    LEFT JOIN product ON input.id = product.id
    UNION
    SELECT * FROM input
        RIGHT JOIN product ON input.id = product.id
    

    【讨论】:

      【解决方案3】:

      这种情况的问题在于“高效”这个词。图片 - 输入 - leftjoin 比内部连接慢,left join inputleft join output 的总和比简单的 inner join 慢。

      select pic.id as pic_id, pic.data, input.id as input_id, output.id as output_id, input....
      from pic 
      left join input on input.pic_id = pic.id
      left join output on output.pic_id = pic.id
      

      select pic.id as pic_id, pic.data, "input" as type, input.id as id, input....
      from pic 
      inner join input on input.pic_id = pic.id
      union
      select pic.id as pic_id, pic.data, "output" as type, output.id as id, output....
      from pic 
      inner join output on output.pic_id = pic.id
      

      联合更快,因为使用了两个内连接。

      【讨论】:

        猜你喜欢
        • 2015-11-23
        • 1970-01-01
        • 1970-01-01
        • 2021-04-30
        • 1970-01-01
        • 2021-12-13
        • 1970-01-01
        • 1970-01-01
        • 2012-02-24
        相关资源
        最近更新 更多