所以这是我的数据库设计,我想选择所有可用的场所。那就是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)。但是,结果实际上是一个空数组,我有很多场地在活动期间尚未预订,我什至没有活动。
答案 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
如果events
和reservations
表为空,则需要使用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