从具有用户ID的行存在的SQL数据库中选择,然后获取所有其他具有相似值的行

我不确定为什么,但是我想尝试使用此select语句遇到了麻烦。也许有一个我不熟悉的PHP / MYSQL函数会有所帮助。这个用户管理软件的想法很简单:有经理,经理可以(但不必)共享客户端。在经理和共享客户关系中,可以指定一位经理作为线索。因此,这是一个基本的示例,该示例说明了一个由2个管理者共享并分配的客户端和另一个也共享但未分配的客户端(以零表示)的数据库外观的示例。

DROP TABLE IF EXISTS clients;

CREATE TABLE clients
(client_id SERIAL PRIMARY KEY,client_name VARCHAR(12) UNIQUE
);

INSERT INTO clients VALUES
(555,'Jimmy'),(789,'Tyler'); 

DROP TABLE IF EXISTS managers;

CREATE TABLE managers
(manager_id SERIAL PRIMARY KEY,manager_name VARCHAR(12)UNIQUE
);

INSERT INTO managers VALUES
(123,'Michael'),(456,'David');

DROP TABLE IF EXISTS relationships;

CREATE TABLE relationships
(client_id INT NOT NULL,manager_id INT NOT NULL,assigned INT NOT NULL,PRIMARY KEY(client_id,manager_id)
);

INSERT INTO relationships VALUES
(555,123,0),(555,456,1),0);

要指出重点:我要说的是让经理看到与他有关系的所有客户,但没有分配给他或团队中的其他任何人,即选择全部我的客户中没有人被指定为主管。

预期输入:显示与经理123有关系但尚未分配给任何经理的所有客户 预期结果:客户端789

很高兴澄清一下,正如我所看到的那样,这显然令人困惑。

bbsoft123 回答:从具有用户ID的行存在的SQL数据库中选择,然后获取所有其他具有相似值的行

因此,您必须首先在RELATIONS中从管理器中查找所有clientid,但要删除所有已分配了管理器的客户机。

根据表的大小,您可能要重写它,但这是一种方法:

1)获取所有没有管理员的客户端ID:

SELECT R1.client_id,SUM(R1.assigned) as sumassigned FROM relationships AS R1 GROUP BY R1.client_id HAVING ( SUM(R1.assigned) = 0)

现在更容易了,您只需加入即可,例如:

SELECT R2.client_id,R2.manager_id FROM relationships AS R2
INNER JOIN 
(SELECT R1.client_id,SUM(R1.assigned) as sumassigned FROM relationships AS R1 GROUP BY R1.client_id HAVING ( SUM(R1.assigned) = 0) ) AS DRVNOMANAGER
ON (R2.client_id = DRVNOMANAGER.client_id)
WHERE (R2.manager_id = 123)

未经测试。(这意味着您可能需要对其进行修复)

这个想法是创建一个包含所有没有管理者的客户的派生(临时)表,然后对原始问题(“这个管理者123知道哪些客户没有分配其他客户”)进行内部联接

能解决您的问题吗?

PS:用PHP更容易解决这些问题,但是如果您的数据集很大,那是不可行的。

OP询问客户名称,所以只需添加:

        SELECT R2.client_id,R2.manager_id,C.client_name  FROM relationships AS R2
INNER JOIN 
        (SELECT R1.client_id,SUM(R1.assigned) as sumassigned FROM relationships
 AS R1 GROUP BY R1.client_id HAVING ( SUM(R1.assigned) = 0) ) AS DRVNOMANAGER
        ON (R2.client_id = DRVNOMANAGER.client_id)
    INNER JOIN clients AS C ON (C.client_id = R2.client_id)
        WHERE (R2.manager_id = 123)

最后一个请求:删除了已删除的关系:

只需将WHERE子句添加到内部DRVNOMANAGER中,就可以限制GROUP BY中使用的行。例如:

SELECT R2.client_id,SUM(R1.assigned) as sumassigned FROM relationships
 AS R1 WHERE (NOT(R1.deleted = 1) ) GROUP BY R1.client_id HAVING ( SUM(R1.assigned) = 0) ) AS DRVNOMANAGER
        ON (R2.client_id = DRVNOMANAGER.client_id)
    INNER JOIN clients AS C ON (C.client_id = R2.client_id)
        WHERE (R2.manager_id = 123)

=============================================

这是我的老答案。不再相关。

“选择我的所有未分配任何潜在客户的客户。”

如果我读得很好,则意味着:从RELATIONS获得所有clientid,其中给出了一些managerid,并且分配的为0。 (assigned = 0表示“没有人被指定为牵头人。”)

对吗?

然后,您最终得到这样的内容(对于managerid 123):

SELECT R.clientid,C.clientname FROM RELATIONSHIPS AS R WHERE ( (R.managerid = 123) AND (R.assigned=0))
INNER JOIN CLIENTS AS C ON (C.clientid = R.clientid)

我删除了列名中的空格,因为我讨厌列名中的空格。

,
SELECT c.* 
  FROM managers m 
  JOIN relationships r 
    ON r.manager_id = m.manager_id 
  JOIN clients c 
    ON c.client_id = r.client_id 
  LEFT 
  JOIN relationships x 
    ON x.client_id = c.client_id 
   AND x.assigned = 1 
 WHERE m.manager_id = 123 
   AND r.assigned = 0 
   AND x.client_id IS NULL;
+-----------+-------------+
| client_id | client_name |
+-----------+-------------+
|       789 | Tyler       |
+-----------+-------------+
本文链接:https://www.f2er.com/3166455.html

大家都在问