单查询中的MySQL双查询

时间:2015-01-04 02:05:12

标签: mysql sql database multiple-tables

我有两张桌子:

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
  3. 我想要一个查询并在单个响应中获得整个结果。可能吗? 如果是这样请建议,我不想粘贴我尝试的东西,因为他们是愚蠢的,我尝试了内连接,左连接,混合查询,但我没有接近。

2 个答案:

答案 0 :(得分:1)

最终,这相当于LEFT JOIN有两个条件。如果uiddrives中没有关联文件夹的记录,则该驱动器将与文件夹列中的NULL一起返回。 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]

答案 1 :(得分:0)

我很确定您需要union查询。我不确定查询是什么,因为您的问题没有指定样本数据或所需结果。例如,不清楚您想要比较哪个用户ID。

但是,以下内容应该与您想要的非常接近:

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;