Php mySQL innerjoin与where条件不起作用
我试图获取过去几个小时mysql查询的结果,但没有得到。我希望你能帮助我 我有两张桌子。第一个表被称为“驱动器”,非常大,有200000多行30列,结构如下:Php mySQL innerjoin与where条件不起作用,php,mysql,database,join,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列。其结构如下: plat
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,所以我在谷歌上搜索了很多,尝试了很多。我所做的以下尝试似乎接近我所需要的:
INNER JOIN fuel.* ON
drives.plate = fuel.plate
WHERE fuel.time Between
drives.timefrom AND
drives.timeto
但它不起作用
*****更新*****
谢谢你迄今为止的帮助。我和一些淘气鬼玩了一会儿,发现了一种非常奇怪的行为。但首先你们是对的——我决定不使用“JOIN”,而是查询两个表并显示组合结果。这似乎是更好的解决办法
但现在问题来了。当我在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为resource,boolean给定错误”:
<?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 } ?>
不幸的是,我无法让我的查询和结果显示工作。对不起,打扰你了,你能告诉我有什么问题吗?非常感谢
*****工作溶液*****
我让它工作了。我的疑问是错误的。这是一份工作报告:
$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");
您的查询应该是
SELECT fuel.* FROM fuel
INNER JOIN drives
ON
drives.plate = fuel.plate
WHERE fuel.time Between
drives.timefrom AND
drives.timeto
改变
INNER JOIN fuel.* ON
到
您发布的SQL部分最明显的错误是在表名后面包含了
*
在MySQL中,添加/省略internal
关键字对语句没有任何影响,即a internal JOIN b
与a JOIN 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
跟进
Q:导致错误的查询
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
^ ^
如果列名中有空格,则需要将列名“转义”为反勾号:
BETWEEN drives.`time from` AND drives.`time to`
^ ^ ^ ^
跟进
也许我之前的例子不够清楚
用JOIN关键字替换过时的逗号语法
已经是2015年了。现在是抛弃join操作的老式逗号语法,用更新的join
关键字替换它的时候了。(将JOIN
关键字称为“更新”是否仍然有效?)
将连接谓词从WHERE
子句移动到ON
子句
数据库并不真正关心;它与内部连接没有区别,谓词是谓词,谓词是谓词。但是我们通常在ON
子句中放置指定如何“匹配”行的谓词,并在WHERE
子句中放置过滤结果集的谓词
我们这样做的原因是,它使未来的读者更容易解读和理解这句话在做什么
也
不要使用。*在选择列表中,明确标识需要返回的表达式
表的名称。*
是方便的速记。但更好的做法是列出需要返回的列和表达式。我们经常发现*
查询返回的列比实际需要的多
虽然您的******工作解决方案****中的查询可能有效,但它确实不太理想
- 用关键字
替换JOIN
和fuel
之间的逗号drives
- 将关键字
替换为WHERE
ON
- 仅指定需要在选择列表中返回的列
内部连接燃油开启了….
不需要*
请提供一个完整的示例,说明您希望一行的外观like@Rahul当前位置它什么也没发生。马丁:当条件匹配时,结果应该是plate | time from | time to | plate | time | amount | price你在应该是columnametimefrom
的列中有一个虚假的空格。。。这里是驱动器之间的。时间从
哦,是的,你说得对。我修好了。但是while循环中的错误“Warning:mysql_fetch_array()期望参数1是resource,boolean-given-error”仍然是相同的。关于该错误的问题被多次询问和回答。进行搜索。不推荐使用mysql\uuz
接口。改用mysqli
或PDO
。检查查询执行的返回。如果
BETWEEN drives.time from AND drives.time to
^ ^
BETWEEN drives.`time from` AND drives.`time to`
^ ^ ^ ^