gpt4 book ai didi

php - mySQL inner join with where条件不起作用

转载 作者:搜寻专家 更新时间:2023-10-30 23:44:08 25 4
gpt4 key购买 nike

我试图获取最近几个小时的 mysql 查询结果,但没有得到。我希望你能帮助我。

我有两张 table 。第一个表称为“驱动器”,非常大,有超过 200000 行和 30 列,结构如下:

 plate | time from        | time to
ab222 | 2015.05.12 08:00 | 2015.05.13 11:37
cv481 | 2015.05.14 12:08 | 2015.05.14 14:11

第二个称为“燃料”,它更短,大约有 5000 行,但也有 22 列。其结构如下:

 plate | time             | amount | price
ab222 | 2015.05.13 09:22 | 2.3 | 32.22
cv481 | 2015.05.14 13:59 | 12.2 | 17.7

我要做的是为“燃料”表中的每一行显示正确的“驱动器”。这意味着“燃料”表的时间必须介于“驱动器”表的“从时间”和“到时间”之间,并且车牌必须相同。结果应显示两个表的列(因此大约 52 列和 5000 行,因为“燃料”表中的每一行必须是“驱动器”表中的一个合适的驱动器)。

我不习惯使用 mysql,所以我用 google 搜索了很多并尝试了很多。我所做的以下尝试似乎接近我所需要的:

INNER JOIN fuel.* ON
drives.plate = fuel.plate
WHERE fuel.time Between
drives.timefrom AND
drives.timeto

但是没用。

*****更新*****

感谢您迄今为止的帮助。我尝试了一些查询并注意到一个非常奇怪的行为。但首先你们是对的——我决定不使用“JOIN”而是查询 2 个表并显示合并结果。这似乎是更好的解决方案。

但是现在的问题。当我在 phpMyAdmin 中查询时,结果是正确的,并且显示了一些匹配项。但是当我将相同的查询传输到 php 时,它显示错误。

这是我连接到我的数据库的方式。效果很好:

$con = mysqli_connect("localhost","root","pass","test"); 
mysqli_options($init, MYSQLI_OPT_LOCAL_INFILE, true);   

这是有效的 phpMyAdmin 中的 MySQL 查询:

SELECT fuel.* , drives.* FROM fuel, drives WHERE fuel.plate = drives.PLATE 
AND fuel.time BETWEEN drives.time from AND drives.time to

在 php 中也是一样的:

$con ­> query ("SELECT fuel.* , drives.* FROM fuel, drives WHERE fuel
plate = drives.PLATE AND fuel.time BETWEEN drives.time from AND 
drives.time to");

它在第一行的以下代码块中导致错误“警告:mysql_fetch_array() 期望参数 1 为资源,给定错误的 bool 值”:

<?php while($row=mysql_fetch_array($con))  {   ?>      <tr>      <td><p>
<?php echo $row['product_id']; ?></p></td>      <td><p>
<?php echo $row['product_name']; ?></p></td>      <td><p>
<?php echo $row['cat_name']; ?></p></td>      </tr>   <?php  } ?>   

我在谷歌上搜索了很多,找到了一些答案,例如变量 $con 为“null”或数组错误。但是,如果我使用以下查询导入一个 csv 文件,它就可以工作:

$con­>query( "LOAD DATA LOCAL INFILE 'drives.csv' INTO TABLE 
rentals FIELDS TERMINATED BY '' ENCLOSED BY '\"' LINES 
TERMINATED BY '\r\n' IGNORE 1 LINES");

不幸的是,我的查询和结果显示无法正常工作。对不起打扰你了,但你能告诉我,这有什么问题吗?非常感谢。

***** 工作解决方案 *****

我成功了。我的查询是错误的。这是工作的:

$blub = mysqli_query($con,"SELECT fuel.* , drives.* FROM fuel, drives 
WHERE fuel.plate = drives.PLATE AND fuel.time BETWEEN drives.time_from AND 
drives.time_to");

最佳答案

您发布的 SQL 部分最明显的错误是在表名后面包含 .*

在MySQL中,INNER关键字的增减对语句没有任何影响,即a INNER JOIN ba同义加入 b

谓词可以出现在 ON 子句或 WHERE 子句中。鉴于谓词是两个表中列的比较,将它们分开有点奇怪,一个条件在 ON 子句中,另一个条件在 WHERE 中条款。数据库不关心这些条件是在 ON 子句中还是在 WHERE 子句中。但是由于这两个条件似乎都与“匹配”行有关,因此(对我而言)它们都在 ON 子句中是有道理的。

举个例子:

 SELECT drives.plate
, drives.timefrom
, drives.timeto
, fuel.plate
, fuel.time
, fuel.amount
, fuel.price
FROM drives
JOIN fuel
ON fuel.plate = drives.plate
AND fuel.time BETWEEN drives.timefrom AND drives.timeto

跟进

问:查询导致错误

 SELECT fuel.* , drives.* FROM fuel, drives WHERE fuel.plate = drives.PLATE 
AND fuel.time BETWEEN drives.time from AND drives.time to

答:你有虚假的空格,其中应该有一个没有空格的列名

              BETWEEN drives.time from AND drives.time to
^ ^

如果列名中有空格,您需要通过将列名括在反引号中来“转义”该列名:

              BETWEEN drives.`time from` AND drives.`time to` 
^ ^ ^ ^

跟进

也许我之前的例子不够清楚。

用 JOIN 关键字替换过时的逗号语法

已经是2015年了。 抛弃连接操作的旧式逗号语法,并用更新的JOIN 关键字替换它,是时候了。 (将 JOIN 关键字称为“较新”真的仍然有效吗?)

将连接谓词从 WHERE 子句移动到 ON 子句

数据库并不关心;它与内部联接没有区别,谓词是谓词是谓词。但我们通常将指定如何“匹配”行的谓词放在 ON 子句中,并将过滤结果集的谓词放在 WHERE 子句中。

我们这样做的原因是它让 future 的读者更容易破译和理解语句的作用。

还有

不要在SELECT列表中使用.*,具体标识你需要返回的表达式

table_name.* 是方便的速记。但最好列出您需要返回的列和表达式。我们经常发现 .* 查询返回的列比实际需要的多。

虽然您的 ***** WORKING SOLUTION ***** 中的查询可能有效,但它确实不太理想。

  • fueldrives 之间的逗号替换为关键字 JOIN
  • 将关键字 WHERE 替换为 ON
  • 仅指定您需要在 SELECT 列表中返回的列

关于php - mySQL inner join with where条件不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31100409/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com