Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php MySQL高级选择查询检查另一个表中的数据_Php_Mysql_Sql - Fatal编程技术网

Php MySQL高级选择查询检查另一个表中的数据

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_

我有一个数据库,我正在努力做一个查询。主表是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

我已经得到了一个点,它似乎重复的行,我需要它是明确的

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