2014-10-20 6 views
0

아래에서이 URL을 http://sqlfiddle.com/#!2/e825f으로 이동하면 내 문제를 더 잘 이해할 수 있습니다.SQL 및 가입

나는 잠시 동안이 쿼리를 얻으려고했으나 알아 내지 못했습니다. 나는 올바른 데이터를 얻기 위해 두 테이블을 조인하려고 노력해 왔지만 어쩌면 내가 세 번째 테이블을 만들어야한다고 생각합니다. - 목록 내가 가진 모든 웹 사이트

  1. 사이트 테이블 : 나는 두 개의 테이블이

    : 아래에있는 내 상황을 참조하십시오. 내 테이블

    create table sites 
    (
        id int, 
        websiteName varchar(50), 
        url varchar(50), 
        mobile_id varchar(50), 
        is_responsive varchar(1)  
    ); 
    
  2. 핸드폰 테이블 생성 방법은 아래를 참조하십시오 - 웹 사이트가 모바일 있습니다 목록 및

    create table mobile 
    (
    id int, 
    mobile_url varchar(50) 
    ); 
    

sites 테이블과 mobiles 테이블이 외국 통해 관련 모바일 URL이 키를 sites [mobile_id] 테이블에 추가합니다.

[사이트 테이블]에있는 is_responsive 열은 1을 보유하는 비트 필드이며이 사이트는 완전하게 반응한다는 것을 나타내거나이 사이트가 0 인 것은 응답하지 않습니다.

목표 : 모든 모바일 웹 사이트 및 응답 형 웹 사이트를 반환하는 쿼리를 작성합니다. 세 개의 테이블을 사용하여 시도했지만 작동하지 않습니다. 원래 세 번째 테이블은 반응이 빠른 모든 웹 사이트를 보유했지만 다른 테이블을 추가하는 것은 의미가 없습니다. 또한 UNION 문을 사용하여 솔루션을 찾았지만이를 사용하고 싶지 않습니다.

+0

죄송 URL을 참조하십시오 http://sqlfiddle.com/#!2/6c1dae – janues

+0

당신이 당신의 목표를 좀 더 자세하게 설명 또는 아마도 샘플 데이터를 제공 할 수 있습니다. – NMK

+0

이 링크로 충분하지 않습니까? 이 url에서 샘플 데이터가 더 필요하십니까? http://sqlfiddle.com/#!2/6c1dae – janues

답변

1

같은 시도 양식은 지정한 결과 집합을 반환 할 수 있습니다.

SELECT s.id 
    , s.websiteName 
    , s.url 
    , s.mobile_id 
    , s.is_responsive 
    , IF(m.mobile_url IS NOT NULL,'1','0') AS is_mobile 
    FROM sites s 
    LEFT 
    JOIN mobile m 
    ON m.mobile_url = s.mobile_id 
WHERE m.mobile_url IS NOT NULL 
    OR s.is_responsive = '1' 

우리는 일반적으로 당신이 외부 키를 가지고 있다고 (그리고 열이 목표 인 지정하지 않은), 및 외래 키 열이 가지고 주어진 id 컬럼을 참조하는 외부 키를 기대하지만 것 VARCHAR (50)의 데이터 유형 인 경우 mobile_url 열을 참조하는 것으로 추측합니다. 이는 모바일에서 일치하는 데이터 유형이있는 유일한 열이기 때문입니다.

의도가 id 열에서 mobile_id해야 일치id 열의 데이터 유형의 다음 데이터 유형을 참조하고 가입하는 경우 조건은 다음과 같습니다의 또한

ON m.id = s.mobile_id 

, 각 당신의 테이블에는 PRIMARY KEY 또는 최소한 UNIQUE KEY로 정의 된 테이블이 있어야합니다.

당신이 게시 된 내용에 따라 내가 사용하는 것이 테이블 정의,

,이 라인을 따라 뭔가 될 것이다 :

CREATE TABLE mobile 
(id   INT UNSIGNED NOT NULL PRIMARY KEY COMMENT 'PK' 
, mobile_url VARCHAR(50)      COMMENT 'mobile website URL' 
) ; 

CREATE TABLE site 
(id   INT UNSIGNED NOT NULL PRIMARY KEY COMMENT 'PK' 
, websiteName VARCHAR(50)      COMMENT 'website name' 
, url   VARCHAR(50)      COMMENT 'website URL' 
, mobile_id INT UNSIGNED      COMMENT 'FK ref mobile.id' 
, is_responsive TINYINT(1) NOT NULL DEFAULT 0 COMMENT 'boolean' 
, CONSTRAINT FK_site_mobile (mobile_id) REFERENCES mobile(id) 
) ; 
0
select * 
from sites 
left outer join mobile on sites.mobile_id = mobile.id 
where sites.is_responsive = '1' or mobile.mobile_url is not null; 
1

나는이 무언가하도록 제안합니다 ... 사양 ... "모든 모바일 웹 사이트 및 웹 사이트의 응답"당신의 설명을 바탕으로이

select sites.* from sites 
left join mobile on mobile.id = sites.mobile_id 
where (sites.is_responsive = '1' or mobile_id is not null) 
0
select mobile_url from from mobile 
union 
select url from sites when is_responsive = 1 
+0

"또한 UNION 문을 사용하는 솔루션을 찾았지만 사용하지 않으려 고합니다." -OP – Smutje

+0

노조가 아니 어서 사용하기에 나쁘다 – janues

+0

"사용 과다"라고 생각하는 이유는 무엇입니까? – agad

0

샘플의 프로그램이 더 모바일 사이트가 반응하지 않는다는 것이다 그러나 코드 당신 먼저 썼다.

select sites.* from sites 
inner join mobile on sites.mobile_id = mobile.id 
where sites.is_responsive = '1'