Php MySQL高级选择查询检查另一个表中的数据
我有一个数据库,我正在努力做一个查询。主表是people,我试图做的是在select查询的末尾添加favorites表中的id,前提是client\u member\u id匹配 我们的想法是在每个人员行中循环,如果该人员id在Favorites表中并且与客户\成员\ id匹配,则在行的末尾添加f.id 客户\成员\ id是给每个客户的一个id,这样当他们喜欢某个人时,详细信息就会被放到最喜欢的人表中。这将是1或2。在SQLFiddle示例中,当client_member_ID为2时,FAVE_ID的预期输出将为68 69,但如果client_member_ID为1,则FAVE_ID都将为null 我已经得到了一个点,它似乎重复的行,我需要它是明确的Php MySQL高级选择查询检查另一个表中的数据,php,mysql,sql,Php,Mysql,Sql,我有一个数据库,我正在努力做一个查询。主表是people,我试图做的是在select查询的末尾添加favorites表中的id,前提是client\u member\u id匹配 我们的想法是在每个人员行中循环,如果该人员id在Favorites表中并且与客户\成员\ id匹配,则在行的末尾添加f.id 客户\成员\ id是给每个客户的一个id,这样当他们喜欢某个人时,详细信息就会被放到最喜欢的人表中。这将是1或2。在SQLFiddle示例中,当client_member_ID为2时,FAVE_
SELECT *, j.company_id as companyid, j.id as jid, p.id as pid,
(CASE WHEN f.client_member_id = 2 AND p.id = f.people_id THEN f.id ELSE null END) AS fave_id,
(CASE WHEN f.client_member_id = 2 AND p.id = f.people_id THEN 1 ELSE 0 END) AS fave
FROM people p
INNER JOIN favourites f
INNER JOIN job j
ON p.job_id = j.id
WHERE p.company_id = 1
ORDER BY p.id ASC
提前谢谢。没有重复项,因为fave_id和fave列,您有4行。如果要过滤它们,下面是一个示例,说明如何仅显示fave=1的值:
SELECT *, j.company_id as companyid, j.id as jid, p.id as pid,
(CASE WHEN f.client_member_id = 2 AND p.id = f.people_id THEN f.id ELSE null END) AS fave_id,
(CASE WHEN f.client_member_id = 2 AND p.id = f.people_id THEN 1 ELSE 0 END) AS fave
FROM people p
INNER JOIN favourites f
INNER JOIN job j
ON p.job_id = j.id
WHERE p.company_id = 1 AND f.client_member_id = 2 AND p.id = f.people_id
ORDER BY p.id ASC
您可以使用左连接到收藏夹以摆脱笨拙的情况:
SELECT *,
j.company_id companyid,
j.id jid,
p.id pid,
f.id fave_id,
f.id IS NOT NULL fave
FROM people p
INNER JOIN job j
ON p.job_id = j.id
LEFT JOIN favourites f
ON f.people_id=p.id
AND f.client_member_id=2
WHERE p.company_id = 1
ORDER BY p.id ASC
注意:这将只为您的小提琴返回两行fave_id和fave,不是NULL和1,但是如果您有一个人没有相应的收藏夹,那么您将得到fave_id和fave,NULL和0。试试这个
您没有将Favorites表连接绑定到任何内容,因此您有了人数行*返回的Favorites数。我使用了左连接,因为我猜您不能保证在people表中每个人都会有最喜欢的?否则,如果您可以更改为内部联接
问候
Liam使用DISTINCT运算符。我在结果中没有看到重复的行,请在解释中更加清楚,或者提供一个示例输出。@Arth当我运行时http://sqlfiddle.com/!2/d62b5d/1我看到人被复制了两次。每个人的两个实例一个是fave_id,一个是Null。当然,您已将每个人加入到两个最喜欢的行中。这是对内部联接的错误使用,您的情况完全被您的WHERE条件否定。这不是我的情况。我知道,但为什么要在一个奇怪的半解决方案中包含冗余代码呢。同时,将你的内心连接整理成最喜欢的。
SELECT *, j.company_id as companyid, j.id as jid, p.id as pid,
(CASE WHEN f.client_member_id = 2 THEN f.id ELSE null END) AS fave_id,
(CASE WHEN f.client_member_id = 2 THEN 1 ELSE 0 END) AS fave
FROM people p
INNER JOIN job j ON p.job_id = j.id
left JOIN favourites f on f.people_id = p.id
WHERE p.company_id = 1
ORDER BY p.id ASC