[英]MySQL subquery returning more than one result
有人能找到一種使該代碼即使在MySQL子查詢返回多個結果的情況下也能起作用的方法嗎? 當用戶沒有與他有關的事件時,或者當用戶有一個與他有關的事件時,它工作正常,但是當用戶與一個以上事件有關時,子查詢返回多個結果,並且代碼沒有任何結果跟...共事。
$stmt = $db->prepare("SELECT * FROM events WHERE
id_events = ( SELECT id_events FROM relationship_events WHERE id_user = ?)");
$stmt->bindParam(1, $idUser);
$stmt->execute();
$rawTimeStamps = $stmt->fetchAll(PDO::FETCH_ASSOC);
$cleanDateArray = array();
foreach ($rawTimeStamps as $t) {
$rawDate = $t['start'];
$rawDate = getdate($rawDate);
$cleanDate = mktime(0,0,0,$rawDate['mon'],$rawDate['mday'],$rawDate['year']);
$cleanDateArray[] = $cleanDate;
}
for($list_day = 1; $list_day <= $days_in_month; $list_day++):
$calendar.= '<td class="calendar-day">';
$timestamp = mktime(0,0,0,$month,$list_day,$year);
if (!empty($cleanDateArray) && in_array($timestamp, $cleanDateArray)) {
$date = getdate($timestamp);
$time_start = mktime(0,0,0,$date['mon'],$date['mday'],$date['year']);
$time_end = mktime(23,59,59,$date['mon'],$date['mday'],$date['year']);
$stmt = $db->prepare('SELECT title FROM events WHERE start BETWEEN ? AND ?');
$stmt->bindParam(1,$time_start,PDO::PARAM_INT);
$stmt->bindParam(2,$time_end,PDO::PARAM_INT);
$stmt->execute();
$events = $stmt->fetch(PDO::FETCH_ASSOC);
$calendar.= '<div class="day-number day-number-event"><a href="#">'.$list_day.'</a></div><p>'.$events["title"].'</p>';
} else {
$calendar.= '<div class="day-number day-number-noevent">'.$list_day.'</div><div id="calendar-events"></div>';
}
查詢應該是SELECT * FROM events WHERE id_events IN ( SELECT id_events FROM relationship_events WHERE id_user = ?)
。
有兩個可能的答案,具體取決於您希望它如何工作。
如果只希望一個事件,無論用戶是否有1個或多個事件,都可以在子查詢中添加LIMIT 1
:
SELECT * FROM events
WHERE id_events = (
SELECT id_events FROM relationship_events WHERE id_user = ? LIMIT 1
)
另一方面,如果要將所有事件分配給用戶,則可以使用IN
子句:
SELECT * FROM events
WHERE id_events IN (
SELECT id_events FROM relationship_events WHERE id_user = ?
)
如果未將用戶分配給任何事件,則這兩個選項也應正常工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.