查询manytomany关系(如果为空则返回)

时间:2015-07-14 08:20:45

标签: mysql

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

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

有3张桌子。 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 entrys,带有一个布尔变量,如下所示:

$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个查询来完成它,但我想只使用一个查询,并想知道这是否可行。

1 个答案:

答案 0 :(得分:1)

使用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