MySQL根据两个表select行

我试图做一个基于另外两个表数据的SELECT查询。 _sites_数组有5个对象, _cats_数组现在有12个对象。 所以,为了得到基于这些对象的news ,我必须重复做12 * 5 sql查询。 (对于每个类别和网站)

我怎样才能减less查询计数?

 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网站名称和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没有做你想做的事情,或者至less如果你有更多的数据,它不会这样做。

编辑添加:

如果您在注释中指出,您确实希望每个类别和站点的组合都有30行限制,那么对于mysql,我只能看到两个select:

  • 通过连接现在通过UNION ALL运算符执行的所有单个查询,形成一个巨大的查询。 仅提交该查询。 这可能是你最好的select,但你也可以
  • 如我第一次build议的那样,使用没有WHERE子句的简单查询,并在node.js端应用行限制。 这种方法可以通过网站和类别另外订购来促进。 虽然这会导致更简单的查询,但可能涉及许多行正在传输然后被丢弃。

这听起来像你正在寻找一个笛卡尔积。 当你从两个不同的表中select而没有定义它们之间的关系时,你会得到这个。 所以,举一个简单的例子:

 SELECT rss_site, cat_name FROM categories, news_url; 

将返回每个可能的(rss_site,cat_name)组合。 但是,我会注意到,由于您有几个重复的rss_site值(示例数据中的cnn),您可能需要在select子句中添加DISTINCT以仅获得不同的对:

 SELECT DISTINCT rss_site, cat_name FROM categories, news_url; 

这是一个SQL小提琴示例。

你的SQL应该可能是这样的:

var sql = "SELECT * "+ "FROM news "+ "WHERE category in (?) AND site in (?) "+ "ORDER BY id DESC LIMIT 30"

因为你有两个数组,而不只是两个值。