mySQL复杂的SELECT查询?

Vit*_*kov 5 php mysql

这是我的表结构:

users:

id | email

emails:

id | subject | body

user_emails:

user_id | email_id
Run Code Online (Sandbox Code Playgroud)

这是非常简单的设计.但是,我需要为user_emails中没有关联的所有users.id选择第一个(最低的)emails.id.

为了显示:

users:

id | email
1 | email@domain.com
2 | test@lol.com
3 | user@test.com

emails:

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

user_emails:

user_id | email_id
1 | 1
1 | 2
2 | 1
Run Code Online (Sandbox Code Playgroud)

如数据显示:

  • 用户1已收到电子邮件1和2,因此选择应排除该用户.
  • 用户2仅收到电子邮件1,因此应选择用户2和电子邮件2.
  • 用户3没有收到任何电子邮件,因此应选择用户3和电子邮件1.

我将在PHP中执行此操作,因此如果不能单独使用mySQL,那么任何逻辑都应该用PHP编写.

提前致谢

编辑:我应该提到将有成千上万的用户ID和数百个电子邮件ID.发送所有这些电子邮件的脚本将每天运行一次.所以,这应该尽可能优化.

Vit*_*kov 0

我想到了一个更简单的解决方案来解决这一切。我向用户表添加了一个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 );
    }
}
Run Code Online (Sandbox Code Playgroud)