我有两个名为ARTICLE
和SAVE
的表。
ARTICLE
表包含整个文章数据。并且SAVE
表具有email
的{{1}}和seq
之间的关系。
ARTICLE
因此,如果用您的帐户(ARTICLE
seq email title content
1 fm@x.y ya hah
2 ch@x.y ho hihi
3 ch@x.y yo hoho
SAVE
seq email article_seq
3 ch@x.y 1
)保存第三篇文章,a@x.y
表将被更改为...
SAVE
我想在ARTICLE调用SAVE
seq email article_seq
3 ch@x.y 1
4 a@x.y 3
中再创建一列(SELECT
的结果)。我希望得到is_saved
的结果:
当我以SELECT
登录
ch@x.y
当我以RESULT
seq email title content is_saved
1 fm@x.y ya hah 1
2 ch@x.y ho hihi 0
3 ch@x.y yo hoho 0
登录
fm@x.y
因此,我需要基于RESULT
seq email title content is_saved
1 fm@x.y ya hah 0
2 ch@x.y ho hihi 0
3 ch@x.y yo hoho 0
JOIN
这两个表,并且我可能需要ARTICLE
条件。我该怎么办?
答案 0 :(得分:2)
首先,您(由用户)选择所有文章,然后对文章seq id进行左连接。您需要左连接来区分已保存(行存在)和未保存(行不存在)。
SELECT
*,
IF(s.is_saved IS NULL, 1, 0) as 'is_saved'
FROM 'ARTICLE' a
LEFT JOIN 'SAVE' s
ON a.seq = s.article_seq
WHERE a.email = :email
由于两个表中都存在email
,因此您似乎也有冗余。
答案 1 :(得分:2)
您似乎想要from datetime import datetime, timezone, timedelta
now = datetime.now(timezone.utc)
epoch = datetime(1970, 1, 1, tzinfo=timezone.utc) # use POSIX epoch
posix_timestamp_micros = (now - epoch) // timedelta(microseconds=1)
event_time = lambda:str(posix_timestamp_micros // 1000)
:
EXISTS
答案 2 :(得分:2)
left join
是表达这一点的自然方法:
select a.*,
(s.seq is not null) as is_saved
from article a left join
save s
on a.seq = s.article_seq and
a.email = s.email;
这假设seq
/ email
的组合最多可以在save
中出现一次。
答案 3 :(得分:2)
我用...解决了这个问题
SELECT *,
(CASE WHEN EXISTS
(SELECT 1
FROM save s
WHERE a.seq = s.article_seq AND s.email=?)
THEN 1 ELSE 0 END)
AS is_saved
FROM article a;
?
是登录用户的电子邮件。如果您可能知道Node.js或Spring(服务器端)。您可能理解我的意思。您将?
用作不确定参数。
例如,您不知道当前哪个人登录。此时,您需要使用问号,以便正确的数据进入SQL。