我有table table_tudo
以及 followItem
,在table上 table_tudo
我有一个专栏叫 tipo
可以有三个值之一 tipoEp, tipoOv and tipoFm
,在这两张table上 INNER JOIN
列 dateMD
以及 itemName
在这之后,我想在屏幕上只打印出与这个contidion匹配的itens table_tudo.dateMD > followItem.dateMD AND followItem.user_id = :user_id AND table_tudo.tipo = :tipoEp OR table_tudo.tipo = :tipoFm OR table_tudo.tipo = :tipoOv
.
在我的查询结束时,我使用 GROUP BY
因为它显示了重复的行。
我不能使用 AND
至 INNER JOIN
两个表中的两列,然后我尝试使用 OR
它起作用了,但现在我有另一个问题,条件 table_tudo.dateMD > followItem.dateMD
不是为公司工作 table_tudo.tipo = :tipoFm OR table_tudo.tipo = :tipoOv
从这些 tipo
的都印在屏幕上,这个条件只适用于 table_tudo.tipo = :tipoEp
.
我的问题怎么了?ps:内部变量 bindParam
是全局变量。
$MTEpPRP = $conn->prepare("SELECT * FROM `table_tudo` INNER JOIN `followItem` ON `table_tudo`.`itemName` = `followItem`.`itemName` OR `table_tudo`.`dateMD` = `followItem`.`dateMD` WHERE `table_tudo`.`dateMD` > `followItem`.`dateMD` AND `followItem`.`user_id` = :user_id AND `table_tudo`.`tipo` = :tipoEp OR `table_tudo`.`tipo` = :tipoFm OR `table_tudo`.`tipo` = :tipoOv GROUP BY `table_tudo`.`id`");
$MTEpPRP->bindParam(':tipoEp', $tipoEp, PDO::PARAM_STR);
$MTEpPRP->bindParam(':tipoFm', $tipoFm, PDO::PARAM_STR);
$MTEpPRP->bindParam(':tipoOv', $tipoOv, PDO::PARAM_STR);
$MTEpPRP->bindParam(':user_id', $user_id, PDO::PARAM_INT);
$MTEpPRP->execute();
我做了一些测试,我也意识到 table_tudo.tipo = :tipoFm OR table_tudo.tipo = :tipoOv
只有当我的查询中有这一行时,才会在屏幕上打印出来 table_tudo.tipo = :tipoEp
.
我认为问题出在 INNER JOIN
因为我在下面测试了这些查询,结果成功了:
$MTEpPRP = $conn->prepare("SELECT * FROM `table_tudo` WHERE `table_tudo`.`tipo` = :tipoOv");
$MTEpPRP->bindParam(':tipoOv', $tipoOv, PDO::PARAM_STR);
$MTEpPRP->execute();
$MTEpPRP = $conn->prepare("SELECT * FROM `table_tudo` WHERE `table_tudo`.`tipo` = :tipoFm");
$MTEpPRP->bindParam(':tipoFm', $tipoFm, PDO::PARAM_STR);
$MTEpPRP->execute();
$MTEpPRP = $conn->prepare("SELECT * FROM `table_tudo` WHERE `table_tudo`.`tipo` = :tipoFm OR `table_tudo`.`tipo` = :tipoOv");
$MTEpPRP->bindParam(':tipoFm', $tipoFm, PDO::PARAM_STR);
$MTEpPRP->bindParam(':tipoFm', $tipoOv, PDO::PARAM_STR);
$MTEpPRP->execute();
4条答案
按热度按时间wz1wpwve1#
试试这样的。
1u4esq0p2#
您的主要查询基本上是正确的。这里的格式是为了更容易阅读表的相关性。我还为表名添加了别名以简化。t和fi(别名)表之间的连接只是那些限定记录的连接。。。匹配的id,用户和日期更大。这是第一部分。
接下来是对“tipo”限定符的限制。我将此更改为使用in子句,因此如果tipo是列表中的任何一个,则为真。
您可能遇到记录未正确返回的问题的原因是,在所有AND之后都有or条件,但没有任何括号。因此,当它有一个匹配,它加入了全面,可能在笛卡尔的结果。
在分组方式中,您需要添加每个表中的列列表,以帮助限制重复,以及您关心哪个表中的列。
ioekq8ef3#
与目标描述相比,查询中存在以下几个问题:
你的join中的2个条件需要
AND
,不是OR
. 也是最WHERE
条件可以直接移动到JOIN
,使逻辑更容易理解您的系统中的操作员预见问题
WHERE
条款;你需要把这封信封起来OR
参与其中,否则它不会像你想的那样... AND (
图多表.
提波= :tipoEp OR
图多表.
提波= :tipoFm OR
图多表.
提波= :tipoOv). Better yet, use an
从句,哪个更容易读更新的查询:
ps:我怀疑
GROUP BY
是有用的,试着移除它,看看会发生什么。2fjabf4q4#
你要求的日期要大于等于同一时间
您可能需要在或条件中使用括号来控制它们的解释方式。
您依赖mysql的非标准groupby来过滤不需要的行,但这些只是近似值。
请参见:https://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html