【问题标题】:MySQL get data from 2 tables based on a conditionMySQL根据条件从2个表中获取数据
【发布时间】:2018-05-31 05:40:32
【问题描述】:

我在 MySQL 数据库中有 4 个表:

1) 供应商(用于保存所有供应商)
2)车辆(用于获取所有车辆)
3) 已分配(用于为某些预订预订车辆)
4) 预订(用于保存所有新预订)

车辆表结构:

vid     vehicleName    sid
==========================
13      xx             28
14      xx             28
15      xx             28
16      xx             29
17      xx             29
18      xx             30

分配的表结构:

asgid    bid   sid   vid   did    assigned_start   assigned_end
===============================================================
42       15    28    15    16     1527804060       1527811320
43       15    28    14    15     1527804060       1527811320

reservation页面我得到一个新的预订日期来分配车辆,该日期将从1527804060开始到1527811320。 (基本上是 06/01/2018 02:01 到 04:02)

现在在这个预订页面上,我可以从供应商和车辆表中显示所有供应商名称及其车辆名称(请参阅下面的查询)。那挺好的。

但我想显示在 assigned_startassinged_end 日期之间尚未预订的那些车辆。

例如:您可以看到vid 15 和 14 已经分配相同旧的和新的预订日期。现在,查询应该只显示 13、16、17、18 没有车辆。 不是,15 和 14,因为它们是在日期之间预订的

当前查询显示所有具有相应供应商名称的车辆:

foreach ($sid as $key => $value) {
    $vehicle->rowQuery("SELECT s.supplierName, v.vid, vehicleName, v.noOfSeat, v.seatBooked, v.type 
                        FROM vehicle AS v 
                        LEFT JOIN supplier AS s ON v.sid = s.sid 
                        RIGHT JOIN driver AS d ON d.vid = v.vid
                        WHERE v.sid = $value
                        ORDER BY v.vid DESC");
}

【问题讨论】:

  • 听起来你想要一个NOT EXISTS 子句。这里有一个例子~stackoverflow.com/a/6839529/283366
  • @Phil 让我检查一下。
  • 最坏的情况,你总是可以把这个复杂的查询分成两个简单的查询。首先查询所有未分配的视频,然后获取此列表中包含视频的所有车辆。
  • @AdrianBaginski 可以举个例子吗?
  • @AdrianBaginski 如何获取所有未分配的视频?为此,我需要运行某种连接查询,对吗?

标签: php mysql


【解决方案1】:

尝试以下方法:

select * from vehicle where vid not in ( 
    select vid from assigned where assigned_end < now() or assigned_start > now() 
) 

【讨论】:

  • 让我试试这个。
  • 我正在使用select * from vehicle where not exist ( select vid from assigned where assigned_start &lt; 1527804060 and assigned_end &gt; 1527811320,但收到错误消息:未捕获的错误:在 null 上调用成员函数 fetch_assoc()
  • 请再次使用我更新的查询。所以没有找到值 - 你真的应该切换到调试环境,比如 phpmyadmin :)
  • 好吧,只做内部查询,看看它是否返回正确的数据行select vid from assigned where assigned_end &lt; now() or assigned_start &gt; now()
  • 我知道,但我认为我应该检查从预订页面获得的数据,而不是现在()。无论如何,看来我得到了解决方案。非常感谢您的辛勤努力。今日英雄:)
猜你喜欢
  • 2020-09-24
  • 1970-01-01
  • 2014-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-26
  • 2021-11-29
相关资源
最近更新 更多