2012-06-21 202 views
5

這裏是我的表結構:mySQL複雜SELECT查詢?

users: 

id | email 

emails: 

id | subject | body 

user_emails: 

user_id | email_id 

這是非常簡單的設計。但是,我需要爲user_emails中沒有關聯的所有users.id選擇第一個(最低)emails.id。

爲了說明:

users: 

id | email 
1 | [email protected] 
2 | [email protected] 
3 | [email protected] 

emails: 

id | subject | body 
1 | sub1 | body1 
2 | sub2 | body2 

user_emails: 

user_id | email_id 
1 | 1 
1 | 2 
2 | 1 

作爲數據顯示:

  • 用戶1接收到的電子郵件1和2已經如此選擇應排除 該用戶。
  • 用戶2只接收到的電子郵件1,所以應該選擇用戶2 和電子郵件2.
  • 用戶3沒有收到任何電子郵件,所以應該選擇用戶3 和電子郵件1.

我將在PHP中這樣做,所以任何邏輯都應該用PHP編寫,如果不能用mySQL完成的話。

在此先感謝

編輯:我也許應該提到,將有成千上萬的用戶ID和數百個電子郵件ID的的。發送所有這些電子郵件的腳本將每天運行一次。所以,這應該儘可能優化。

+2

請閱讀LEFT JOIN。 –

+0

我有,但我不是很熟悉mySQL,它讓我感到困惑。 –

+1

你的答案應該貼出來,然後你應該接受一個答案。 :-) –

回答

0

我想到了一個更簡單的解決方案。我在users表中添加了lastSent列。

// Load all emails into an array. Use the id as the key. 
$sql = "SELECT * FROM emails"; 
$query = mysql_query($sql); 
while($row = mysql_fetch_assoc($query)) { 
    $emails[ $row['id'] ] = $row; 
} 

// Load all users into an array. 
$sql = "SELECT id, email, lastSent FROM users"; 
$query = mysql_query($sql); 
while($row = mysql_fetch_assoc($query)) { 
    $users = $row; 
} 

// Loop through each user and send next email from the list based on lastSent value. 
foreach ($users as $user) { 
    $id = $user['lastSent'] + 1; 
    $email = $user['email']; 
    $subject = $emails[$id]['subject']; 
    $body = $emails[$id]['body']; 
    $send = mail($email, $subject, $body); 
    if ($send) { 
      // Update lastSent value. 
     $sql = "UPDATE users SET lastSent='$id' WHERE id='" . $user['id'] . "'"; 
     mysql_query($sql); 
    } 
} 
2

可以嘗試如下:

SELECT * from users u 
LEFT JOIN users_emails e ON u.id=e.user_id 
LEFT OUTER JOIN emails m on m.id=1 
WHERE e.user_id is NULL 

或者使用下面如果沒有必要的電子郵件標識爲1如上查詢。

SELECT * from users u 
LEFT JOIN users_emails e ON u.id=e.user_id 
LEFT OUTER join emails m on m.id=(SELECT id from emails order by id limit 1) 
WHERE e.user_id is NULL 
0

給人以從下面的查詢

選擇t.id,分(t.q_id)一試(SELECT u.id,e.id作爲q_id來自用戶的U形橫JOIN電子郵件E)作爲t其中(t.id,t.q_id)不在(select * from user_emails)組中t.id