【问题标题】:MySQL Select JOIN multiple TablesMySQL选择JOIN多个表
【发布时间】:2013-01-25 03:36:58
【问题描述】:

我基本上有两组表。 “道具_”和“可用_”。每个约。我使用 UNION ALL 加入的 4 个表。

我需要选择没有出现在特定日期范围的可用性表中的具有必要位置和睡眠的属性。

property tables... 'props_01', 'props_02', 'props_03', 'props_04'
   id    code         location    sleeps
   1     7A06E91875   devon       2
   2     440ac2664c   cornwall    4
   5     0474d4882b   devon       2


availability tables... 'avail_01', 'avail_02', 'avail_03', 'avail_04'
   id    prop_code     date
   1     440ac2664c    20130208
   2     440ac2664c    20130209
   3     440ac2664c    20130210
   4     440ac2664c    20130211
   5     440ac2664c    20130212

这些可用性表格包含所有预订日期。所以我希望只从他们没有指定日期范围的可用性记录的属性表中进行选择。这就是我想要查询它的方式......

(avail.date != '20130209' AND avail.date != '20130210' AND avail.date != '20130211' AND avail.date != '20130212' AND avail.date != '20130213') OR (avail.date != '20130210' AND avail.date != '20130211' AND avail.date != '20130212' AND avail.date != '20130213' AND avail.date != '20130214') 

我还需要对位置和睡眠的属性表应用过滤器。

除了可用性之外,我所做的一切都在下面的查询,这很好用,但我不知道如何最好地修改它以查询可用性表...

SELECT prop.* FROM (SELECT * FROM `props_01` UNION ALL SELECT * FROM `props_02` UNION ALL SELECT * FROM `props_03` UNION ALL SELECT * FROM `props_04`) prop WHERE prop.location='Devon' AND prop.sleeps>='4' ORDER BY prop.sleeps ASC

【问题讨论】:

  • 为什么要分组表?为什么不使用 1 个属性表和 1 个可用性表?
  • 因为我使用不同的来源,所以希望每个来源都有一个单独的表,可用性也相同。我想为每个来源使用单独的表,因为我的高级搜索将允许人们选择来源,所以我认为这会更快,因为我只能为每个查询一个表,因为一组属性的可用性表超过 150k记录
  • 我所说的“来源”的意思是可以选择要查询的道具表,但 99% 的时间我需要查询所有来源(道具表)
  • 这是一个可怕的想法。如果向数据库添加属性意味着结构和所有相关查询的更改,则暗示您做错了什么!
  • 最好将数据保存在单独的表中,而不是查询一个拥有接近 500k 记录的 MASSIVE 表!这有多可怕!?解释...

标签: php mysql select join union-all


【解决方案1】:

如果您要查找另一个表中不存在的行,则需要左连接。有关更多信息,请参阅此:

http://dev.mysql.com/doc/refman/5.0/en/join.html

http://dev.mysql.com/doc/refman/5.0/en/left-join-optimization.html

【讨论】:

  • 谢谢,但是如果我想查询多个表,那将如何工作?我将 UNION ALL 应用于两组表,但查询抛出错误
【解决方案2】:

加入 3 个表:Table1、Table2、Table3

SELECT * FROM table1 LEFT JOIN table2 ON table1.id=table2.id LEFT JOIN table3 ON table2.id=table3.id;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-02-11
    • 1970-01-01
    • 2013-10-12
    • 2013-11-08
    • 2015-02-27
    • 1970-01-01
    • 2011-02-26
    • 2018-11-19
    相关资源
    最近更新 更多