2010-06-15 85 views
0

我有两个表格,一个是包含数字资产(例如文章,图片等)的资产表格,第二个表格是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); 

我期待编写一个查询将返回满足任何资产的所有资产搜索条件并在同一查询中返回该资产的链接资产的所有链接资产数据。

例如该查询返回的资产1和2将返回:

  • 资产1属性

    • 资产3属性
    • 资产4属性
  • 资产2属性

    • 资产10属性
    • 资产56属性

是编写查询的最好方法?

+0

你能在阅读后回答你的问题吗?花些时间阅读常见问题解答并正确设置代码格式。 – Anax 2010-06-15 23:53:30

+0

我试图格式化它,但没有代码标签的原始粘贴删除了空格。 OP可以放回去。 – 2010-06-15 23:58:58

+0

我已经编辑了OP的表格定义,使其更具可读性。 – 2010-06-16 00:41:11

回答

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。

+0

感谢您的回复。对不起,我没有正确解释我之后的事情。 根据asset_links表中的上述数据,此查询返回6行。 根据asset_links表中的上述数据,我希望它返回2行并将相关行作为行的子集: 感谢您的帮助 – GMo 2010-06-18 05:07:26