mySQL内部连接,条件不起作用

时间:2015-06-28 13:33:48

标签: php mysql database join

我正在尝试获取最后几小时的mysql查询结果,但没有得到它。我希望你能帮助我。

我有两张桌子。第一个表称为“驱动器”,非常大,有超过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行,因为'fuel'表中的每一行必须是'drive'表中的一个拟合驱动器。)

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

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

但它不起作用。

***** UPDATE *****

感谢您的帮助。我玩了一些查询并注意到一种非常奇怪的行为。但首先你们是对的 - 我决定不使用“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是资源,在第一行的以下代码块中给定ERROR'的布尔值:

<?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  } ?>   

我google了很多,找到了一些答案,比如变量$ 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");

3 个答案:

答案 0 :(得分:1)

您发布的SQL部分最明显错误的一件事是在表名后面加上 .*

在MySQL中,添加/省略INNER关键字对语句没有任何影响,即a INNER JOIN ba JOIN b同义。

谓词可以出现在ON子句或WHERE子句中。鉴于谓词是两个表中列的比较,将它们拆分有点奇怪,ON子句中有一个条件,WHERE子句中有另一个条件。数据库并不关心这些条件是在ON子句还是WHERE子句中。但由于这两个条件似乎都是关于&#34;匹配&#34;在行中,(对我来说)这些都是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

A:你有假的空格,应该有一个没有空格的列名

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

如果列名中有空格,则需要&#34;转义&#34;列名称将其括在反引号中:

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

<强>后续

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

用JOIN关键字

替换过时的逗号语法

2015年已经到了。过去时间 ditch 用于加入操作的旧式逗号语法,并将其替换为较新的JOIN关键字。 (将JOIN关键字称为&#34;更新&#34;?<)<

真的仍然有效吗?

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

数据库并不真正关心;它与内连接没有区别,谓词是谓词是谓词。但我们通常会使用谓词来指定行如何匹配&#34;在ON子句中,并将用于过滤结果集的谓词放在WHERE子句中。

我们这样做的原因是它使更容易让未来的读者破译并理解该陈述的作用。

另外

不要在SELECT列表中使用。*,专门识别您需要返回的表达式

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

虽然***** WORKING SOLUTION *****中的查询可能正常,但实际上并不理想。

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

答案 1 :(得分:0)

您的查询应该是

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

答案 2 :(得分:0)

更改

INNER JOIN fuel.* ON

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