gpt4 book ai didi

MySQL根据两个表选择行

转载 作者:行者123 更新时间:2023-11-29 06:19:53 25 4
gpt4 key购买 nike

我正在尝试根据另外两个表数据进行 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)
})
}

cats 表:(类别)

|id|cat_name|cat_pos|
|1 |Fun | 1 |
|1 |Bomm | 2 |

news_url 表:(rss 站点名称和 url)

|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 行限制。如果可以使用一些查询。

最佳答案

如果您不想为每个站点的每个类别单独查询,那您为什么要这样做?如果您只是从您现在使用的查询中省略 WHERE 子句,那么它将一次性为您提供所有类别和站点的所有新闻,受 30 行 LIMIT 你已经放置了。

如果您希望为类别和站点的每个组合单独设置 30 行限制,这将更加棘手,正如您当前的方法所提供的那样,但我倾向于怀疑 LIMIT 不是现在完全按照您的意愿去做,或者至少如果您有更多数据,它就不会这样做。

编辑添加:

如果正如您在评论中指出的那样,您确实希望每个类别和站点的组合都限制在 30 行,那么对于 mysql,我只看到两种选择:

  • 通过UNION ALL 运算符连接您现在执行的所有单个查询,形成一个巨大的查询。仅提交该查询。这可能是您最好的选择,但您也可以
  • 按照我最初的建议,使用不带 WHERE 子句的简单查询,并在 node.js 端应用行限制。可以通过按站点和类别额外订购来促进此方法。虽然这会导致更简单的查询,但它可能涉及传输然后丢弃许多行。

关于MySQL根据两个表选择行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33873412/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com