查询背后的逻辑

时间:2018-11-11 09:42:03

标签: php mysql

所以这是我的数据库设计,我想选择所有可用的场所。那就是events.date_of_use。我不知道这里的逻辑,我尝试查询:

SELECT * FROM venues v 
  JOIN reservations r ON v.venue_id = r.venue_id 
  JOIN events e ON e.reservation_id = r.reservation_id 
WHERE e.date_of_use NOT IN ('$dates')

$ dates只是一串日期(即11-11-2018,11-12-2018)。但是,结果实际上是一个空数组,我有很多场地在活动期间尚未预订,我什至没有活动。

4 个答案:

答案 0 :(得分:0)

如果您所说的$dates变量是一个以逗号分隔的日期为“ 11-11-2018,11-12-2018”的字符串,则查询将变为:

WHERE e.date_of_use NOT IN ('11-11-2018, 11-12-2018')

正确的格式为:

WHERE e.date_of_use NOT IN ('2018-11-11', '2018-11-12')

即每个日期都应在IN内分别导出,日期格式为YYYY-MM-DD。

还要处理场地不存在事件的情况:

SELECT * FROM venues v 
JOIN reservations r ON v.venue_id = r.venue_id 
LEFT JOIN events e ON e.reservation_id = r.reservation_id 
  AND (e.date_of_use IS NULL OR e.date_of_use NOT IN ('2018-11-11', '2018-11-12'))

答案 1 :(得分:0)

$dates字符串中有错误。

应将其格式设置为'11-11-2018', '11-12-2018',即每个值都应用引号引起来,以使IN查询正常工作。

当前,您的查询看起来像

WHERE e.date_of_use NOT IN ('11-11-2018, 11-12-2018');

它将搜索包含2个日期而不是单个日期的行。

这是正确查询的样子,

SELECT * FROM venues v 
JOIN reservations r ON v.venue_id = r.venue_id 
JOIN events e ON e.reservation_id = r.reservation_id 
WHERE e.date_of_use NOT IN ('11-11-2018', '11-12-2018')

更新1

根据您的评论,您必须使用','插入数组。

$dates = implode( "','", $date );

然后下面的WHERE子句将很完美,

WHERE e.date_of_use NOT IN ('$dates')

更新2

如果eventsreservations表为空,则需要使用LEFT JOIN并在date_of_use IS NULL

处获取行
SELECT * FROM venues v 
LEFT JOIN reservations r ON v.venue_id = r.venue_id 
LEFT JOIN events e ON e.reservation_id = r.reservation_id 
WHERE e.date_of_use NOT IN ('$dates')
OR e.date_of_use IS NULL

答案 2 :(得分:0)

您可以像这样在php中构造数组:

backProfileImgView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            //call only onBackPressed
            onBackPressed();
        }
    });

并像这样附加php变量:

<?php
$DateArray=array();
$DateArray=["11-11-2018", "12-11-2018","11-11-2018", "11-12-2018"];

$Dates='(';
foreach ($DateArray as $key => $value) 
{   $Dates=$Dates." ".$value.",";       }

$Dates=rtrim($Dates,",");
$Dates=$Dates.")"; // contains ( 11-11-2018, 12-11-2018, 11-11-2018, 11-12-2018)
?>

答案 3 :(得分:0)

为什么不简单地使用查询进行调试?

类似

SELECT * FROM events e 
WHERE e.date_of_use NOT IN ('11-11-2018', '11-12-2018')

在PHP中使用爆破功能替换日期数组。

此外,您最好使用日期类型而不是文本。 https://dev.mysql.com/doc/refman/8.0/en/date-and-time-functions.html#function_date-format