2015-01-04 3 views
1

У меня есть две таблицы:MySQL двойной запрос в одном запросе

CREATE TABLE folders (
ID BIGINT PRIMARY KEY AUTO_INCREMENT, 
uid BIGINT NOT NULL, 
driveid BIGINT NOT NULL, 
foldername VARCHAR(64) NOT NULL, 
icon_url varchar(260), 
time_created timestamp NOT NULL default '0000-00-00 00:00:00', 
time_updated timestamp NOT NULL default '0000-00-00 00:00:00' on update CURRENT_TIMESTAMP, 
time_expires timestamp NOT NULL default '0000-00-00 00:00:00' 
) ENGINE=MyISAM DEFAULT CHARSET=utf8; 


CREATE TABLE drives (
ID BIGINT PRIMARY KEY AUTO_INCREMENT, 
uid BIGINT NOT NULL, 
drivename VARCHAR(100) NOT NULL, 
icon_url varchar(260), 
time_created timestamp NOT NULL default '0000-00-00 00:00:00', 
time_updated timestamp NOT NULL default '0000-00-00 00:00:00' on update CURRENT_TIMESTAMP, 
time_expires timestamp NOT NULL default '0000-00-00 00:00:00' 

) ENGINE=MyISAM DEFAULT CHARSET=utf8; 

Я хочу, чтобы выбрать диски и все папки, где:

  1. в таблице дисков, где uid = UID NUMBER
  2. в папках, где dbid = ID от приводов, которые также имеют UID = given UID number

Я хочу получить один запрос и получить весь результат в одном ответе. Является ли это возможным? Если да, пожалуйста, совет, я не хочу вставлять то, что я пробовал, поскольку они глупы, я пробовал внутреннее соединение, левое соединение, смешанные запросы, но я не приблизился.

+0

Значит, ваши отношения 'drives.ID = folders.dbid'? И номер 'uid', который вы хотите отфильтровать, - это то, что _same_ uid для« дисков »и« папок », или это _different_ uid? –

+0

@MichaelBerkowski, да, это тот же UID, на самом деле он должен быть таким же UID, UID для идентификатора пользователя, DBID для ID диска – JustACPPFan

+0

'driveid'' NOT NULL', поэтому каждая папка принадлежит одному диску, но есть диски у которых нет папок для 'uid', и должны ли они быть возвращены? –

ответ

1

В конечном счете, это сводится к LEFT JOIN с двумя условиями. Если uid имеет записи в drives без связанных папок, диск будет возвращен вместе с NULL s в столбцах папки. driveid должен соответствовать drives.ID, а uid должен быть одинаковым; оба они будут указаны в предложении ON.

SELECT 
    drives.ID AS driveid, 
    drives.drivename, 
    drives.uid, 
    folders.ID AS folderid, 
    folders.foldername, 
    folders.icon_url, 
    drives.time_created AS drive_time_created, 
    drives.time_updated AS drive_time_updated, 
    drives.time_expires AS drive_time_expires, 
    folders.time_created AS folders_time_created, 
    folders.time_updated AS folders_time_updated, 
    folders.time_expires AS folders_time_expires 
FROM 
    drives 
    LEFT JOIN folders 
    ON drives.ID = folders.driveid 
    AND drives.uid = folders.uid 
WHERE 
    drives.uid = [the-specified-uid] 
+0

Папка без диска невозможна, возможен привод без папки. Итак, вы считаете, что этот ответ должен хорошо работать? – JustACPPFan

+0

Да, это то, что осталось от цели объединения - можно вернуть диски без папок. –

+0

Спасибо, я попробую и дам вам знать результаты. – JustACPPFan

0

Я уверен, что вам нужен запрос union. Я не совсем уверен, что такое запрос, потому что ваш вопрос не указывает данные образца или желаемые результаты. Например, неясно, какой идентификатор пользователя вы хотите для сравнения.

Однако, следующее должно быть очень близко к тому, что вы хотите:

select d.id as driveid, NULL as folderid 
from drives d 
where d.uid = @UID 
union all 
select d.id, f.id as folderid 
from drives d join 
    folders f 
    on f.dbid = d.id 
where f.uid = @UID; 
+0

Я хочу такой же идентификатор пользователя, поэтому в основном есть пользовательские диски и папки. Поэтому я хочу читать все диски и папки для определенного UID, folders.dbid ==> drives.id – JustACPPFan

Смежные вопросы