2012-11-06 214 views
0

是否有人想出一種方法來使此代碼工作,即使當MySQL子查詢返回多個結果?當用戶沒有與他有關的事件時,或者當用戶有一個與他有關的事件時,它工作正常,但當一個用戶與多個事件相關時,子查詢返回多於一個結果並且比代碼沒有任何工作。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>'; 
    } 

回答

3

查詢應該是SELECT * FROM events WHERE id_events IN (SELECT id_events FROM relationship_events WHERE id_user = ?)

+1

這就是它!使用這種查詢邏輯解決了我的問題!即使我捲入另一個子查詢(這是我的另一種情況,它工作正常!)非常感謝! – akplebani

+0

快樂編碼! :-) – Unpredictable

1

根據您希望如何工作,有兩種可能的答案。

如果你只想要一個單一的事件,不管用戶有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 = ? 
) 

如果用戶被分配到任何事件這兩個也應該很好地工作。