![](/img/trans.png)
[英]Ajax call to php, get mysql data as array and use in JS function
[英]MySQL NOT IN function of array of data
所以這是我的數據庫設計,我想選擇給定日期數組的所有可用場地: 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
只是一串日期(即 11-11-2018、11-12-2018)。 然而,結果實際上返回一個空數組,我有很多尚未預訂的場地。
$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
如果$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'))
您可以像這樣在 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;
為什么不使用簡化查詢進行調試?
就像是
SELECT * FROM events e
WHERE e.date_of_use NOT IN ('11-11-2018', '11-12-2018')
使用 PHP 中的 implode 函數替換日期數組。
此外,您最好使用日期類型而不是文本。 https://dev.mysql.com/doc/refman/8.0/en/date-and-time-functions.html#function_date-format
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.