我正在尝试根据另外两个表数据进行SELECT
查询。
_sites_
数组有5个对象,_cats_
数组现在有12个对象。因此,为了基于这些对象获取news
,我必须重复进行12 * 5
sql查询。 (对于每个类别和网站)
如何减少查询次数?
getSites(function (_sites_) {
getCategories(function (_cats_) {
var array = []
async.each(_sites_, function (site, next) {
async.each(_cats_, function (cat, next2) {
var sql = "SELECT * "+
"FROM news "+
"WHERE category = ? AND site = ? "+
"ORDER BY id DESC LIMIT 30"
db.query(sql, [cat.data, site.data], function (result) {
array = array.concat(temp)
next2()
})
}, function () {
next()
})
}, function () {
// finished
console.log(array)
})
})
})
function getCats (pass) { //get used categories
db.query("SELECT * FROM cat WHERE cat_name in (SELECT news_url.rss_cat FROM news_url)"+
"ORDER by cat_pos ASC", [], function (result) {
var array = []
if(result) {
for (var j = 0; j < result.length; j++) {
array.push({type: 1, data:result[j].cat_name})
};
}
pass(array)
})
}
function getSites (pass) {
db.query("SELECT * FROM news_url", [], function (result) {
var array = []
if(result) {
for (var j = 0; j < result.length; j++) {
array.push({type: 0, data:result[j].rss_site})
};
}
pass(array)
})
}
猫表:(类别)
|id|cat_name|cat_pos|
|1 |Fun | 1 |
|1 |Bomm | 2 |
news_url 表:( rss网站名称和网址)
|id|rss_site|rss_url |rss_cat
|1 |Cnn |http://...|Fun
|2 |Fox |http://...|Bomm
|3 |Cnn |http://...|Bomm
|4 |Routers |http://...|Fun
新闻表:
|id|news_site | news_cat | news_content
|1 | Cnn | Bomm | Some random news content from Cnn
|2 | Cnn | Fun | Some random news content from Cnn
|3 | Fox | Fun | Some random news content from Fox
预期结果是每个类别和网站组合的单独N行限制。如果可以使用一些查询。
答案 0 :(得分:1)
如果您不想单独查询每个网站的每个类别,那么您为什么要这样做?如果您只是忽略了当前使用的查询中的WHERE
子句,那么一次性它将为您提供所有类别和网站的所有新闻,但需要放置30行LIMIT
如果你想为每个类别和网站组合分别设置30行限制,这将会更加棘手,正如你当前的方法所提供的那样,但我倾向于怀疑LIMIT
没有做到什么你想要它现在做,或者至少如果你有更多的数据就不会这样做。
已编辑添加:
如果您在评论中指出,您确实希望每个类别和网站组合都有30行限制,那么对于mysql,我只看到两种选择:
UNION ALL
运算符连接您现在执行的所有单个查询,形成一个巨大的查询。仅提交该查询。这可能是你最好的选择,但你也可以WHERE
子句的简单查询,正如我第一次建议的那样,并在node.js端应用行限制。通过网站和类别另外订购可以促进这种方法。虽然这会导致查询更简单,但可能涉及许多行被传输然后被丢弃。