sourcecode

mysql 결과에서 제외할 사용자 호스트 쌍 제공

codebag 2023. 10. 10. 20:18
반응형

mysql 결과에서 제외할 사용자 호스트 쌍 제공

작업할 데이터:

+-------------+-------------+
| user        | host        |
+-------------+-------------+
| user1       | host1       | -
| user1       | ip1         | -
| user1       | host2       | *
| user2       | host2       | -
| user2       | ip2         | -
| unknown     | unknown     | +
| user1       | unknown     | +
| unknown     | host        | +
+-------------+-------------+

표 오른쪽에 있는 기호는: - 표시 안 함 | + 알 수 없는 상태로 표시 | *입니다. 이는 사용자가 하나의 호스트에만 연결할 수 있기 때문입니다. 이 경우 사용자 호스트 쌍을 통화에 제공해도 표시되지 않는 경우가 아니라면 말입니다.

어쨌든 일이 잘 풀렸으면 좋겠어요.

이것이 가 제 질문의 도움을 받고 있는 곳이고, 이제 새로운 질문이 필요한 추가 조건이 생겼기 때문입니다.

현재진행중

USE mysql;
DROP PROCEDURE IF EXISTS ShowUsers;
DELIMITER $

CREATE PROCEDURE `ShowUsers`(
  IN KnownUsers varchar(500),
  IN KnownHosts varchar(500)
)
BEGIN
  SELECT
    user,host
  FROM
    user
  WHERE 
    NOT FIND_IN_SET(host, KnownHosts)
  AND
    NOT FIND_IN_SET(user, KnownUsers)
  ORDER BY user, host ASC;
END $
DELIMITER ;

절차를 이렇게 부르는 것.

# known users and known hostnames or ips to match and exclude from results.
SET @Usernames = 'user1,user2';
SET @Hostnames = 'host1,host2,ip1,ip2'

CALL ShowUsers(@Usernames, @Hostnames);

의도한 결과:

+-------------+-------------+
| user        | host        |
+-------------+-------------+
| user1       | host2       | *
| unknown     | unknown     | +
| user1       | unknown     | +
| unknown     | host        | +
+-------------+-------------+

여러 사용자: 호스트 쌍(적법한 자격 증명으로 알려진)을 제공하고 일치하지 않는 결과를 반환할 수 있으므로 쿼리 결과에서 의심스러운/적법한 자격 증명만 반환합니다.

저는 fiddle https://www.db-fiddle.com/f/xb7dWXbkokHGbcPdzR7BUa/4 을 만들었습니다. 여러분이 이것으로 제가 어디로 가고 있는지 볼 수 있기를 바랍니다.

문제 설명문을 통해 이해할 수 있는 내용을 토대로 조건을 충족하려면 여러 문자열 연산을 사용해야 합니다(아래 인라인 코멘트로 설명).

쿼리

SELECT
  `user`,`host`
FROM
  tbl
WHERE 

 -- NOT condition to avoid returning one-to-one mapping between `user` and `host`
 -- If `user` exist in the @Usernames, and the position of the 
 -- `user` matches with the position of the `host` in the @Hostnames
 NOT ( 
       FIND_IN_SET(`user`, @Usernames) > 0
       -- Host and User are at same position in the lists
       AND FIND_IN_SET(`user`, @Usernames) = FIND_IN_SET(`host`, @Hostnames) 
     )

 AND 

 -- NOT condition to handle `host` at the end of @Hostnames list, where 
 -- there is no corresponding `user` mapped
 NOT ( 
      FIND_IN_SET(`host`, @Hostnames) > CHAR_LENGTH(@Usernames) 
                                        - CHAR_LENGTH(REPLACE(@Usernames, ',', '')) 
                                        + 1 
     );

결과

| user    | host    |
| ------- | ------- |
| user1   | host2   |
| unknown | unknown |
| user1   | unknown |
| unknown | host    |

DB Fiddle 보기

주의 사항: 위 쿼리는 사용자가 없을 때 작동하지 않습니다.@Usernameslist. 간략하게 설명하기 위해 조건을 더 복잡하게 만드는 것을 피했습니다.게다가, 당신의 실용적인 사용 사례에서 목록에 사용자가 없는 상황이 발생하지는 않을 것입니다.

이 구성은 다음과 같이 작동합니다(큰 테이블의 경우에는 효율적이지 않습니다).

WHERE (user, host) NOT IN ( ('u1', 'h1'), ('u2', 'h2), ... )

자세한 내용은 "행 생성자"를 참조하십시오.

언급URL : https://stackoverflow.com/questions/58256066/supply-user-host-pairs-to-be-excluded-from-mysql-results

반응형