单查询中的MySQL双查询

单查询中的MySQL双查询,mysql,sql,database,multiple-tables,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 tim

我有两张桌子:

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;
我要选择驱动器和所有文件夹,其中:

在驱动器表中,uid=uid编号 在文件夹中,其中dbid=ID来自同样具有UID=给定UID编号的驱动器 我想要一个查询并在一个响应中得到整个结果。可能吗?
如果是这样,请给出建议,我不想粘贴我尝试过的内容,因为它们很愚蠢,我尝试了内部连接、左连接、混合查询,但我没有成功。

我很确定您需要一个联合查询。我不确定查询是什么,因为您的问题没有指定示例数据或所需结果。例如,不清楚您想要哪个用户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;

最终,这相当于具有两个条件的左连接。如果uid在没有关联文件夹的驱动器中有记录,则该驱动器将与文件夹列中的空值一起返回。driveid必须与drives.ID匹配,uid必须相同;这两项都将在ON条款中规定


那么您的关系是drives.ID=folders.dbid?您要筛选的uid号-驱动器和文件夹的uid是相同的,还是不同的uid?@MichaelBerkowski,是的,它是相同的uid,事实上它应该是相同的uid,uid代表用户ID,DBID代表驱动器IDdriveid不为空,因此每个文件夹都属于一个驱动器,但是否有驱动器没有文件夹作为uid,它们应该被归还吗?@MichaelBerkowski想象一下,它就像一个计算机文件系统,在特定的驱动器下创建文件夹,用户可以有无限的驱动器,每个驱动器都有无限的文件夹。所以文件夹表中的所有文件夹都将有UID和DRIVEID,UID=>user ID和DRIVEID=>ForID在驱动器表中。特定用户的UID在文件夹表和驱动器表中是相同的。@MichaelBerkowski,对于这个特定的问题,我愿意接受所有类型的想法,特别是性能和质量问题,即使你告诉我更好的表设计,我也可以重新设计。有驱动器,文件夹,然后文件表。我想要相同的用户ID,所以基本上有用户驱动器和文件夹。因此,我想读取特定UID的所有驱动器和文件夹。folders.dbid==>drives.idfolders没有驱动器是不可能的,drive没有文件夹是可能的。所以你仍然认为这个答案应该有效吗?是的-这就是加入目标的原因-可以返回没有文件夹的驱动器。谢谢,我会尝试一下,并让你知道结果。你认为我的设计对驱动器和文件夹的性能是好的吗?有什么建议/想法吗?
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]