需要SQL查询的帮助

时间:2011-03-09 02:23:40

标签: mysql sql

当前查询

SELECT *
FROM employee AS E
INNER JOIN credential AS C ON (C.id = E.credentialId)
LEFT JOIN person AS P ON (C.personId = P.id)

我想修改此查询,以便我只选择具有loginroles 1和2(loginrole.id)的employees /凭证。

相关表格

loginrole
    id
    name
credential_has_loginrole
    id
    credentialId
    loginroleId

2 个答案:

答案 0 :(得分:1)

您可以加入子查询,该子查询将返回具有两个登录角色的凭证ID。

SELECT E.*, C.*, P.*
FROM employee AS E
  INNER JOIN (
      SELECT credentialId
      FROM credential_has_loginrole
      WHERE loginroleId IN (1,2)
      GROUP BY credentialId
      HAVING COUNT(DISTINCT loginroleId) = 2
    ) g ON E.credentialId = g.credentialId
  INNER JOIN credential AS C ON (C.id = E.credentialId)
  LEFT JOIN person AS P ON (C.personId = P.id)

更新:根据评论,查找员工或:或

SELECT E.*, C.*, P.*
FROM employee AS E
  INNER JOIN (
      SELECT credentialId
      FROM credential_has_loginrole
      WHERE loginroleId IN (1,2)
      GROUP BY credentialId
    ) g ON E.credentialId = g.credentialId
  INNER JOIN credential AS C ON (C.id = E.credentialId)
  LEFT JOIN person AS P ON (C.personId = P.id)

或者,您可以将JOINDISTINCT一起使用:

SELECT DISTINCT E.*, C.*, P.*
FROM employee AS E
  INNER JOIN credential AS C ON (C.id = E.credentialId)
  INNER JOIN credential_has_loginrole chr
    ON E.credentialId = chr.credentialId
      AND chr.loginroleId IN (1,2)
  LEFT JOIN person AS P ON (C.personId = P.id)

答案 1 :(得分:0)

Scrum Meister的回答是正确的。您也可以使用2个连接树:

    SELECT *
    FROM employee AS E
    INNER JOIN credential AS c 
        INNER JOIN credential_has_loginrole chl0 ON (c0.id=chl0.credentialId AND chl0.loginroleId=1)
        INNER JOIN credential_has_loginrole chl1 ON (c0.id=chl1.credentialId AND chl1.loginroleId=2)
    ON (c.id = E.credentialId)