mysql - 查询多对多关系(如果为空也返回)

标签 mysql

我正在构建一个弹出窗口,您可以在其中勾选复选框。选项和选择以多对多关系存储在 mysql 数据库内。

[ ] option A
[x] option B
[ ] option C

有3张 table 。 sphotossphoto_feedbacksphoto_has_feedbacks。 sphoto_has_feedbacks 存储 sphoto_id、sphoto_feedback_id 和 user_id,以引用已提交投票的用户。

sphoto
id | status_id | ...
1  | ...

sphoto_feedback
id | name     | ...
11 | Quality  |
12 | Creative |

sphoto_has_feedbacks
id | sphoto_id | sphoto_feedback_id | user_id
1  | 1         | 11                 | 9999

输入为 user_id => 9999sphoto_id => 1。所需的输出将是一个数组,其中包含所有 sphoto_feedback 条目,并带有一个 bool 变量,如下所示:

$output = [
   "0" => [
      "id" => 11,
      "name" => "Quality",
      "checked" => true
   ],
   "1" => [
      "id" => 12,
      "name" => "Creative",
      "checked" => false
   ]
]

它看起来像这样:

[x] Quality <-- stored in sphoto_feedback, also stored in sphoto_has_feedbacks with reference to user
[ ] Creative <-- stored in sphoto_feedback

我想从数据库中检索所有选项并检查用户是否已经对选项进行了投票。

我知道如何在 PHP 中使用 2 个查询来完成此操作,但我只想使用一个查询,并且想知道这是否可行。

最佳答案

使用LEFT JOIN连接sphoto_feedbacksphoto_has_feedback表,为表中的所有行返回NULL第一个表在第二个表中没有匹配项。

SELECT f.id, f.name, shf.id IS NOT NULL AS checked
FROM sphoto_feedback AS f
LEFT JOIN sphoto_has_feedback AS shf 
ON f.id = shf.sphoto_feedback_id
    AND shf.sphoto_id = 1 AND shf.user_id = 9999

关于mysql - 查询多对多关系(如果为空也返回),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31401408/

相关文章:

mysql - 按空记录分组

mysql - 一条sql语句联合父子表获取两张表的记录

java - 使用mysql、jdbc创建表

mysql - 在创建 ID 的同一语句中使用 auto_incremented ID

php - 无法使用 docker compose 将 phpmyadmin 连接到数据库

php - 将多行发送到一封电子邮件,但按行发送多封电子邮件

python - django.db.utils.OperationalError : (1045:Access denied for user 'root' @'localhost' (using password: NO)

mysql - 将子查询结果添加到查询中

Mysql Entity Framework 问题 - 指定的键太长;最大 key 长度为 3072 字节

MySQL .NET 连接器包