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。您可以告诉我吗?