我有2个表,一个是包含数字资产的资产表(例如文章,图像等),第二个表是asset_links表,它映射资产表中包含的资产之间的1-1关系。
以下是表格定义:
CREATE TABLE `asset` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`source` varchar(255) DEFAULT NULL,
`title` varchar(255) DEFAULT NULL,
`date_created` datetime DEFAULT NULL,
`date_embargo` datetime DEFAULT NULL,
`date_expires` datetime DEFAULT NULL,
`date_updated` datetime DEFAULT NULL,
`keywords` varchar(255) DEFAULT NULL,
`status` int(11) DEFAULT NULL,
`priority` int(11) DEFAULT NULL,
`fk_site` int(11) DEFAULT NULL,
`resource_type` varchar(255) DEFAULT NULL,
`resource_id` int(11) DEFAULT NULL,
`fk_user` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB;
CREATE TABLE `asset_links` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`asset_id1` int(11) DEFAULT NULL,
`asset_id2` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB;
在asset_links表中有以下行:
INSERT INTO `Asset_links` (asset_id1, asset_id2) VALUES
(1,3), (1,4), (2,10), (2,56);
我希望编写一个查询,它将返回满足任何资产搜索条件的所有资产,并在同一查询中返回该资产的链接资产的所有链接资产数据。
e.g。返回资产1和2的查询将返回:
资产1属性
资产2属性
编写查询的最佳方法是什么?
答案 0 :(得分:0)
SELECT a1.*, a2.*
FROM Asset a1
LEFT OUTER JOIN (Asset_Links l JOIN Asset a2 ON l.asset_id2 = a2.id)
ON (a1.id = l.asset_id1)
WHERE a1.id IN (1, 2)
AND ...whatever conditions you want here...
我正在为您的“任何搜索条件”留下占位符文字,因为这不是一个真正的问题。
重新评论:您无法在一个查询中从关系数据库中获取您描述的结果。 SQL查询结果必须在每一行上具有相同的列,并且每一行都具有这些列的值。您无法在单个SQL查询中执行所描述的操作。
如果您想要一个包含超行和子行的结果集,则必须使用非关系数据库。试试CouchDB或MongoDB。