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 |
주의 사항: 위 쿼리는 사용자가 없을 때 작동하지 않습니다.@Usernames
list. 간략하게 설명하기 위해 조건을 더 복잡하게 만드는 것을 피했습니다.게다가, 당신의 실용적인 사용 사례에서 목록에 사용자가 없는 상황이 발생하지는 않을 것입니다.
이 구성은 다음과 같이 작동합니다(큰 테이블의 경우에는 효율적이지 않습니다).
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
'sourcecode' 카테고리의 다른 글
결측값이 있는 열의 부분 집합에 대한 행 단위 평균 (0) | 2023.10.10 |
---|---|
PHP 읽기 전용 속성? (0) | 2023.10.10 |
보기 호출기 내부의 조각 바꾸기 (0) | 2023.10.10 |
이 Oracle ORA-01403을 처리하는 올바른 방법은 무엇입니까? 데이터를 찾을 수 없음 예외? (0) | 2023.10.10 |
농담에서 스파이를 리셋하거나 클리어하는 방법은? (0) | 2023.10.10 |