Php 如何使用join子句仅检查行是否存在?
我有两张这样的桌子:Php 如何使用join子句仅检查行是否存在?,php,mysql,pdo,Php,Mysql,Pdo,我有两张这样的桌子: // Posts +----+---------+-----------------+----------+ | id | title | content | amount | +----+---------+-----------------+----------+ | 1 | title1 | content1 | NULL | | 2 | title2 | content2 | 1000 |
// 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
JOIN Money_Paid mp ON p.id = mp.post_id
WHERE mp.user_id = :user_id
AND p.id = :post_id
我想做的一切:我的一些帖子不是免费的,任何想看的人都应该付费。现在我需要一个查询来检查当前用户是否支付了该帖子的费用?(仅适用于非免费邮件)
以下是一些示例(基于当前表格)
我想要查询的全部内容:我想要一个列包含
true
或false
(仅针对非免费帖子)来告诉我当前用户是否支付了当前帖子的费用。换句话说:
在Money\u paid
表中有一行user\u id=:user\u id
=>true
没有任何行->
false
查询如下所示:
// 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
JOIN Money_Paid mp ON p.id = mp.post_id
WHERE mp.user_id = :user_id
AND p.id = :post_id
如果用户已为内容付费,则返回该行。如果用户没有为内容付费,则不会返回任何内容。查询如下:
// 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
JOIN Money_Paid mp ON p.id = mp.post_id
WHERE mp.user_id = :user_id
AND p.id = :post_id
如果用户已为内容付费,则返回该行。如果用户没有为内容付费,则不会返回任何内容。我不能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
不是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
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
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
或
若您想要一个列,它将告诉您是否可以查看post或不可以尝试类似的操作(左连接和if语句)
若列canView为1,那个么用户可以查看帖子,否则他不能。您还可以检查特定的帖子,只需添加
,其中p.id=:post\u id
,如果您想要一个列,该列将告诉您是否可以查看帖子或不尝试类似的操作(左连接和if语句)
若列canView为1,那个么用户可以查看帖子,否则他不能。您也可以检查特定的帖子,只需添加
其中p.id=:post\u id
请编辑您的问题,并将您想要的内容作为输出。您是否尝试在p.amount上加入Money\u Paid mp。amount不为NULL,mp.post\u id=p.id和mp.user\u id=:user\u id???@GordonLinoff我做了。@GordonLinoff您可以告诉我吗?请编辑您的问题和答案包括您想要的内容作为输出。您是否尝试在p上加入Money\u Paid mp。amount不为NULL,并且mp.post\u id=p.id和mp.user\u id=:user\u id???@GordonLinoff我做了。@GordonLinoff您可以告诉我吗?相信我,我知道如何将当前用户id传递给查询。@对不起,我不理解这个问题。用正确的查询更新我的答案,让我知道它是否有效。:)谢谢你的更新。但是我真的不能在PHP中使用这个查询的ouptu来做我需要的事情。如果结果为真或假,您仍然可以使用if
语句进行检查。如果有行,则返回true;如果没有行,则返回false。试试看。相信我,我知道如何将当前用户id传递给查询。@对不起,我不明白这个问题。用正确的查询更新我的答案,让我知道它是否有效。:)谢谢你的更新。但是我真的不能在PHP中使用这个查询的ouptu来做我需要的事情。如果结果为真或假,您仍然可以使用if
语句进行检查。如果有行,则返回true;如果没有行,则返回false。试试看。为什么内部连接
?为什么不LEFT JOIN
?因为我们知道帖子和用户,所以不需要虚假的外部连接。它的0或1与内部连接可以避免空数据为什么内部连接
?为什么不LEFT JOIN
?因为我们知道帖子和用户,所以不需要虚假的外部连接。它的0或1带有内部,您可以避免空数据EMM,只有一个,来检查行是否存在,我应该使用count(1)
?@stack吗?这就是case
语句为您所做的。将其与外部联接一起使用,它将检查行是否存在,并相应地返回true或false。您可以告诉我吗?嗯,只有一件事,要检查行是否存在,我应该使用计数(1)
?@stack吗?这就是case
语句为您所做的。将其与外部联接一起使用,它将检查该行是否存在,并相应地返回true或false。您可以告诉我吗?