[英]How do I use join clause to only check whether row exists?
我有两个这样的表:
// Posts
+----+---------+-----------------+----------+
| id | title | content | amount |
+----+---------+-----------------+----------+
| 1 | title1 | content1 | NULL |
| 2 | title2 | content2 | 1000 |
| 3 | title3 | content3 | 5000 |
| 4 | title4 | content4 | NULL |
| 5 | title5 | content5 | 2000 |
+----+---------+-----------------+----------+
// ^ NULL means that question is free
// Money_Paid
+----+---------+---------+
| id | user_id | post_id |
+----+---------+---------+
| 1 | 123 | 2 |
| 2 | 345 | 5 |
| 3 | 123 | 5 |
+----+---------+---------+
我正在尝试做的所有事情:我的一些帖子不是免费的,而且任何人都希望看到他们应该支付费用。 现在,我需要一个查询来检查当前用户是否已支付该帖子的费用? (仅适用于非免费帖子)
SELECT * FROM Posts p WHERE id = :post_id
LEFT JOIN Money_Paid mp ON p.amount IS NOT NULL AND ...
以下是一些示例 :( 基于当前表)
$stm->bindValue(":post_id", 2, PDO::PARAM_INT);
$stm->bindValue(":user_id", 123, PDO::PARAM_INT);
//=> TRUE (the user of '123' can see this post because he paid post's cost)
$stm->bindValue(":post_id", 2, PDO::PARAM_INT);
$stm->bindValue(":user_id", 345, PDO::PARAM_INT);
//=> FALSE (the user of '345' cannot see this post because he didn't pay post's cost)
$stm->bindValue(":post_id", 5, PDO::PARAM_INT);
$stm->bindValue(":user_id", 345, PDO::PARAM_INT);
//=> TRUE
我只需要查询:我希望一列包含true
或false
(仅适用于非免费帖子),以告诉我当前用户是否支付了当前帖子的费用。 换句话说:
Money_paid
表中有一行,其中user_id = :user_id
=> true
没有任何行-> false
并非100%肯定我会理解您期望的结果,但是这是一种添加新列的方法,该列可以根据用户是否付款而返回true或false:
select *,
case when mp.id is not null then 'true' else 'false' end paid
from Posts p
left join Money_Paid mp ON mp.post_id = p.id and mp.user_id = :user_id
where p.id = :post_id
查询如下所示:
SELECT *
FROM Posts p
JOIN Money_Paid mp ON p.id = mp.post_id
WHERE mp.user_id = :user_id
AND p.id = :post_id
如果用户已经为内容付费,则将返回该行。 如果用户没有为内容付费,则不会返回任何内容。
正如我评论的那样,您可以尝试(检查联接的位置)
SELECT * FROM Posts p
INNER JOIN Money_Paid mp ON p.amount IS NOT NULL AND
JOIN Money_Paid mp ON
mp.post_id = p.id AND p.amount IS NOT NULL AND mp.user_id = :user_id
WHERE
id = :post_id
另外,您可以列出所有列表。
SELECT * FROM Posts p
WHERE
p.amount IS NULL
UNION
SELECT * FROM Posts p
INNER JOIN Money_Paid mp ON
p.amount IS NOT NULL AND
mp.post_id = p.id AND
mp.user_id = :user_id
要么
SELECT * FROM Posts p
WHERE
p.amount IS NULL
OR p.id in (
SELECT post_id FROM Money_Paid mp
WHERE
p.amount IS NOT NULL AND
mp.user_id = :user_id
)
如果您想要的列将告诉您是否可以查看帖子或不尝试这样的操作(左联接和if语句)
select
p.*,
if(p.amount is not null, if(mp.user_id is not null, 1, 0), 1) as canView
from Posts p
left join Money_Paid mp on mp.post_id = p.id and mp.user_id = :user_id;
如果canView列为1,则用户可以查看帖子,否则无法查看。 您也可以检查特定的帖子,只需在where p.id = :post_id
添加where p.id = :post_id
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.