2014-10-20 3 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. Mobiles таблицы - списки, какие сайты являются мобильными и имеет мобильный URL

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

sites стол и mobiles таблицы связаны между собой через иностранные в таблице sites, названной [mobile_id].

Столбец is_responsive, расположенный в таблице [sites], является битовым полем, в котором содержится 1, указав, что этот сайт полностью реагирует, или 0, заявляя, что этот сайт не реагирует.

МОЙ ЦЕЛЬ: Чтобы создать запрос, который возвращает все мобильные сайты и отзывчивые веб-сайты. Я попытался использовать три таблицы, но это не сработало. Первоначально мой третий стол содержал все отзывные сайты, но добавление другой таблицы не имеет смысла. Также я нашел решение, использующее оператор UNION, но я не хочу его использовать.

+0

извините смотрите этот адрес: 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 или, по крайней мере, уникальную таблицу с уникальным ключом.

определения таблиц Я хотел бы использовать, основываясь на том, что вы в курсе, было бы что-то вдоль этих линий:

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' 
Смежные вопросы