查询返回相关资产

时间:2010-06-15 23:51:08

标签: mysql

我有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属性

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

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

编写查询的最佳方法是什么?

1 个答案:

答案 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。