【发布时间】:2015-11-30 05:14:03
【问题描述】:
我有如下表,我试图找到如何
得到的结果是文章 id 数组或文章行,
同时匹配ArticleTag0 和ArticleTag1 表中的标签'hiphop'、'rock'、'single'。
现在我使用下面的代码,
获取以不同标签类型标记的每篇文章 id 数组,
例如,如果文章 x Tag0 中标记的文章 ID 行是 [0, 2, 4, 6] 并且文章 x Tag1 是 [0, 4, 9],
然后比较每个数组,得到上面两个数组中的数字 get ,[0, 4]。
我想知道有没有更好的查询一次选择它们?考虑性能
表格
CREATE TABLE IF NOT EXISTS "Article"(
"ArticleId" SERIAL NOT NULL,
"PublishDate" timestamp without time zone,
"Active" bit NOT NULL,
PRIMARY KEY ("ArticleId")
);
CREATE TABLE IF NOT EXISTS "Tag0"(
"TagId" SERIAL NOT NULL,
"Name" varchar,
"Active" bit NOT NULL,
PRIMARY KEY ("TagId")
);
CREATE TABLE IF NOT EXISTS "Tag1"(
"TagId" SERIAL NOT NULL,
"Name" varchar,
"Active" bit NOT NULL,
PRIMARY KEY ("TagId")
);
CREATE TABLE IF NOT EXISTS "ArticleTag0"(
"ArticleTagId" SERIAL NOT NULL,
"ArticleId" integer NOT NULL,
"TagId" integer NOT NULL,
FOREIGN KEY ("ArticleId") REFERENCES "Article" ("ArticleId") ON DELETE CASCADE ON UPDATE CASCADE,
FOREIGN KEY ("TagId") REFERENCES "Tag0" ("TagId") ON DELETE CASCADE ON UPDATE CASCADE,
PRIMARY KEY ("ArticleTagId")
);
CREATE TABLE IF NOT EXISTS "ArticleTag1"(
"ArticleTagId" SERIAL NOT NULL,
"ArticleId" integer NOT NULL,
"TagId" integer NOT NULL,
FOREIGN KEY ("ArticleId") REFERENCES "Article" ("ArticleId") ON DELETE CASCADE ON UPDATE CASCADE,
FOREIGN KEY ("TagId") REFERENCES "Tag1" ("TagId") ON DELETE CASCADE ON UPDATE CASCADE,
PRIMARY KEY ("ArticleTagId")
);
代码
用户输入参数
inputGenres (Tag0) - [ 'hiphop', 'rock' ]
inputReleaseType (Tag1) - ['single']
...
// inputGenres
var inputGenresArticleIdList = [];
if (inputGenres[0] == 'all') {
var query = 'SELECT * FROM "Article"';
var params = [];
var selectArticle = yield crudDatabase(db,query,params);
if (typeof selectArticle.error !== 'undefined') {
response.meta.code = '500';
} else {
for (var i = 0; i < selectArticle.result.rows.length; i++) {
inputGenresArticleIdList.push(selectArticle.result.rows[i].ArticleId);
}
}
} else {
var query = 'SELECT DISTINCT ON ("ArticleId") * FROM "ArticleTag0" LEFT OUTER JOIN "Tag0" ON ("ArticleTag0"."TagId" = "Tag0"."TagId") WHERE "Name" IN (';
for (var i = 0; i < inputGenres.length; i++) {
if (i > 0) {
query += ',';
}
query += '$' + (i + 1);
}
query += ')';
var params = inputGenres;
var selectArticleTag0 = yield crudDatabase(db,query,params);
if (typeof selectArticleTag0.error !== 'undefined') {
response.meta.code = '500';
} else {
for (var i = 0; i < selectArticleTag0.result.rows.length; i++) {
inputGenresArticleIdList.push(selectArticleTag0.result.rows[i].ArticleId);
}
}
}
console.log(inputGenresArticleIdList);
// end: inputGenres
// inputReleaseType
var inputReleaseTypeArticleIdList = [];
if (inputReleaseType[0] == 'all') {
var query = 'SELECT * FROM "Article"';
var params = [];
var selectArticle = yield crudDatabase(db,query,params);
if (typeof selectArticle.error !== 'undefined') {
response.meta.code = '500';
} else {
for (var i = 0; i < selectArticle.result.rows.length; i++) {
inputReleaseTypeArticleIdList.push(selectArticle.result.rows[i].ArticleId);
}
}
} else {
var query = 'SELECT DISTINCT ON ("ArticleId") * FROM "ArticleTag4" LEFT OUTER JOIN "Tag4" ON ("ArticleTag4"."TagId" = "Tag4"."TagId") WHERE "Name" IN (';
for (var i = 0; i < inputReleaseType.length; i++) {
if (i > 0) {
query += ',';
}
query += '$' + (i + 1);
}
query += ')';
var params = inputReleaseType;
var selectArticleTag4 = yield crudDatabase(db,query,params);
if (typeof selectArticleTag4.error !== 'undefined') {
response.meta.code = '500';
} else {
for (var i = 0; i < selectArticleTag4.result.rows.length; i++) {
inputReleaseTypeArticleIdList.push(selectArticleTag4.result.rows[i].ArticleId);
}
}
}
console.log(inputReleaseTypeArticleIdList);
// end: inputReleaseType
... then loop each array and compare
【问题讨论】:
标签: javascript sql node.js postgresql