SQL:从表 1 中选择行并存在(表 2 中的行)
Posted
技术标签:
【中文标题】SQL:从表 1 中选择行并存在(表 2 中的行)【英文标题】:SQL : select rows from table 1 and exists (rows from table 2) 【发布时间】:2014-02-10 11:03:58 【问题描述】:我正在尝试选择行并向此选择添加一个布尔值,以测试记录在另一个表中的多对多关系的存在。
这是我的代码:
$q = $this->dao->prepare('
SELECT wishlists.id, wishlists.title, wishlists.comment, wishlists.date, users.name, users.username
FROM wishlists
LEFT JOIN users ON wishlists.user = users.id
WHERE users.username = :username
ORDER BY wishlists.date DESC
');
$q->bindValue(':username', $user);
$q->execute();
这将返回一个包含我所有字段的表格。我想用这种子查询在这个表中添加一列:
SELECT EXISTS(SELECT 1 FROM wishlists_following WHERE wishlist_id = wishlists.id AND user_id = :current_user_id)
其中 current_user_id 是访问者的 ID,$user 是当前用户个人资料页面。
最好的方法是什么?
目标是获取有关愿望清单的所有信息,并了解当前用户是否关注此愿望清单(以便为返回的每个愿望清单显示关注按钮)。
【问题讨论】:
【参考方案1】:当您在愿望清单和用户之间使用 LEFT JOIN 时,如果没有与愿望清单相关的用户,您将获得用户名和用户列的 NULL 值。
所以我认为您不需要另一个查询:您只需在获得第一个查询的结果后测试列 users.name 的无效性。
【讨论】:
对不起,我的子查询出错了。实际上,user_id 必须等于当前访问者 id,而不是用户配置文件 id。 (希望用户名包含在 $user 中) 它不会改变答案:通过您的第一个查询,您将能够检索所有愿望清单,包括那些与您作为参数传递的 user_id 无关的愿望清单。访问者是数据库模型中的另一个表,还是用户表的 id?请提供信息。 同一张表。这是我的数据库:用户(id、用户名和其他信息)wishlists(id、title、comment、user_id)-> 多对一关系 wishlists_following(id、user_id、wishlist_id)-> 多对多关系所以用户 1(访问者)可以关注用户 2(当前个人资料页面)拥有的愿望清单。 好的,我明白你在做什么。我会执行以下操作: SELECT w.title, w.comment, wf.user_id FROM WISHLIST w LEFT JOIN WISHLIST_FOLLOWING wf ON w.user_id = wf.user_id wf.user_id = 访客 ID(我假设你已经知道了)。您应该检索如下内容: w.title w.comment wf.user_id WL1 Comment1 1 WL2 Comment2 3 WL3 Comment3 NULL 表示访问者未关注 WL3。 好的,谢谢。当您回答时,我也找到了该解决方案。我现在问自己这是否是最好的方法(关于性能)。我在这里问这个问题:***.com/questions/21678262/…【参考方案2】:检查您的第一个查询中的名称或用户名字段 - 直接在查询中或在执行查询后在您的脚本中,如果它为空,则表示用户没有关注愿望清单,否则她/他会。 关键是使用 LEFT join 允许这个并且你已经拥有它。
【讨论】:
以上是关于SQL:从表 1 中选择行并存在(表 2 中的行)的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 where/have 子句选择唯一行并与另一个表进行比较