2011-03-12 34 views
0

我有一個對話表和一個受邀表。會話表將所有消息與conversationId一起存儲(不需要了解更多信息)。被邀請的表格有兩個名爲conversationId和profileId的列。我想選擇與邀請列表相匹配的conversationId。我如何在MYSQL和PHP中做到這一點?從邀請中選擇對話ID

到目前爲止,我已經在PHP中做到了這一點:

$sql = " 
    SELECT invited.conversationId, count(invited.conversationId) AS cof 
    FROM conversation_invited AS invited 
    WHERE invited.profileId = '$profileId'//This is myself 
    "; 
    $i = 0; 
    foreach($invited as $v){//$invited is an array of invited's profileIds 
      $sql .= " 
    AND  invited.profileId = '$v' "; 
     $i++; 
    } 

    $sql .= " 
    GROUP BY invited.conversationId 
    ORDER BY count(invited.conversationId) ASC 
    LIMIT 1 
"; 

,我要創建的SQL語句要匹配邀請準確。例如,如果邀請數組由['27','34','36']組成,則比我想要找到恰好匹配受邀請數組的對話(Id)。也沒少,也沒有更多的邀請

+1

看在上帝的份上,轉義你在SQL查詢中使用的變量! http://php.net/manual/en/function.mysql-real-escape-string.php – 2011-03-12 18:33:46

+0

謝謝布魯諾雷斯 – einstein 2011-03-12 18:39:50

回答

0

試試這個

$invites = join(',', array_merge($invited, (array)$profileId)) 
$sql = " 
    SELECT invited.conversationId, count(invited.conversationId) AS cof 
    FROM conversation_invited AS invited 
    WHERE invited.profileId IN($invites) 
    GROUP BY invited.conversationId 
    ORDER BY count(invited.conversationId) ASC 
    LIMIT 1 
"; 
+0

嗨這個解決方案有一個問題。 「我自己」被邀請參加許多對話。如果一個對話有三個被邀請,上面的sql語句將永遠不會選擇該對話Id,因爲Iäm被邀請只與兩個被邀請的對話。因此,「選擇與被邀請列表匹配的conversationId」將不適合使用上面的sql語句 – einstein 2011-03-12 19:20:58

+0

爲什麼?我不明白 – azat 2011-03-12 19:30:19

+0

假設我被邀請參加兩個對話,一個邀請三個,一個邀請兩個,包括我自己的邀請。我想創建的sql語句想要匹配被邀請的。例如,如果邀請數組由['27','34','36']組成,則比我想要找到恰好匹配受邀請數組的對話(Id)。有了上述說明,它只會返回兩個邀請的對話 – einstein 2011-03-12 19:37:14

0
function add_quotes(&$item) { 
    $item = "'$item'"; 
} 
array_walk($invited, 'add_quotes'); 
$t = implode(',', $invited); 
$sql = " 
    SELECT invited.conversationId, count(invited.conversationId) AS cof 
    FROM conversation_invited AS invited 
    WHERE invited.profileId IN ('$profileId', $t) 
    GROUP BY invited.conversationId 
    ORDER BY count(invited.conversationId) ASC 
    LIMIT 1 
"; 

注意上面將改變$invited值。