簡體   English   中英

MySQL NOT IN 數據數組的函數

[英]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

如果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

如果$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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM