2014-06-22 4 views
-3

금지 된 사용자와 IP를 표시하려고하지만 두 테이블에 있습니다. 웹 사이트 사용자를위한 테이블이 있는데 그 테이블에는 '금지'열과 금지 된 IP에 대한 다른 테이블이 있습니다. 그래서 이런 걸 원하는 :두 개의 다른 테이블에서 모든 데이터 선택

=

users.username 금지 ipban.reason

ipban.ip, ipban.admin을 선택

(이 쿼리는 정확하지 않습니다. 내 문제를 설명하기 위해 작성했습니다)

그리고 은 테이블에을 표시합니다. 그럼 어떻게하는거야?

+1

공통 필드에 INNER JOIN을 사용하십시오. ** SELECT * 사용자 INNER JOIN ip on users.field = ip.field where users.ban = 1 ** 또는 이와 비슷한 것. –

+1

이 두 테이블간에 관계가 있습니까? 아니면 상호 배타적입니까? – ak0053792

+0

두 테이블 스키마에 대한 정보를 질문에 추가하십시오. 이 두 테이블을 조인 할 열이 있어야합니다 (예 : ips 테이블에 user_id가 있음). 그렇지 않으면 사용자가 금지되거나 IP가 금지 될 수 있도록 데이터베이스 스키마가 시스템을 설명합니다. 이 경우 생성하려는 표시 테이블이 잘못된 정보입니다. –

답변

3

사용 UNION, 이런 식으로 뭔가 :

(SELECT NULL, ipban.ip, ipban.admin, ipban.reason FROM ipban) 
UNION ALL 
(SELECT users.username,NULL,NULL,NULL FROM users WHERE ban=1) 

이 두 테이블에 가입 할 공통 필드가 없다고 가정합니다. 에서

+0

이전에 비슷한 쿼리를 시도했지만 실제로 작동했습니다. 고맙습니다! –

2
SELECT ipban.ip, ipban.admin, ipban.reason, users.username FROM ip, users WHERE users.somekey = ipban.somekey and users.ban = 1 

ban 가정하면 users 테이블에 있습니다.

또한 내부 조인 사용하여 테이블을 연결할 수 있습니다

SELECT ipban.ip, ipban.admin, ipban.reason, users.username FROM users INNER JOIN ip ON users.somekey = ip.somekey WHERE users.ban = 1 

두 테이블의 모든 열을 얻기 위해 사용

SELECT * FROM users INNER JOIN ip ON users.somekey = ip.somekey WHERE users.ban = 1 
+0

이 두 테이블은 연결되어 있지 않으며 일치하는 필드가 없다는 것을 언급하면됩니다. –

+0

테이블이 연결되어 있지 않으면 UNION을 사용하여 전체 목록을 얻는 것이 좋은 해결책이 아닙니다. 두 가지 쿼리를 고려하십시오. 사용자가 users 테이블에서 발견되면 ip 테이블을 확인할 필요가 없으며 그 반대의 경우도 마찬가지입니다. UNION을 사용하면 인덱스가 제공되지 않으므로 데이터베이스가 커질수록이 쿼리는 더 느리고 느려집니다. –

+0

UNION은 작동하지만 페이지의 두 탭에서 두 개의 쿼리로 구분했습니다.그런데 users 테이블은 등록 된 사용자를위한 것이며 ipban 테이블은 등록되지 않았고 사용자 이름이 없지만 웹 사이트에서하지 말아야하는 사용자를위한 것입니다. 따라서 ip와 users 테이블은 연결되어 있지 않으며 사용자가 금지되어 있으면 ipban 테이블에 있지 않습니다. 어쨌든 고마워. –

0

선택 ipban.ip, ipban.admin, ipban.reason, users.username 은 내부 ipban 공통 속성에 사용자에게 가입 (여기 당신이 테이블 모두에 열을 제공해야한다) 곳 금지 = 1;

관련 문제