mysql不支持数据数组

r7s23pms  于 2021-06-18  发布在  Mysql
关注(0)|答案(4)|浏览(379)

所以这是我的数据库设计,我想选择所有可用的场馆,给出日期数组: events.date_of_use .

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')
``` `$dates` 只是一串日期(即2018年11月11日、2018年11月12日)。但是,结果返回一个空数组事实上,我有很多场地还没有预定。
![](https://i.stack.imgur.com/2zNgZ.png)
vshtjzan

vshtjzan1#

为什么不使用simplify查询进行调试?
像这样的

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-格式

dauxcl2d

dauxcl2d2#

您可以用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)
?>

然后像这样附加php变量:

SELECT * FROM venues v, reservations r, events e
WHERE v.venue_id = r.venue_id 
AND e.reservation_id = r.reservation_id AND e.date_of_use NOT IN .$Dates;
s8vozzvw

s8vozzvw3#

文件中有错误 $dates 字符串。
格式应为 '11-11-2018', '11-12-2018' i、 每一个值都应该用引号括起来 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 并获取日期使用的行 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

af7jpaap

af7jpaap4#

如果 $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')

i、 e.每个日期都应单独列明 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'))

相关问题