MySQL基于两个表

时间:2015-11-23 14:26:48

标签: mysql sql node.js

我正在尝试根据另外两个表数据进行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行限制。如果可以使用一些查询。

1 个答案:

答案 0 :(得分:1)

如果您不想单独查询每个网站的每个类别,那么您为什么要这样做?如果您只是忽略了当前使用的查询中的WHERE子句,那么一次性它将为您提供所有类别和网站的所有新闻,但需要放置30行LIMIT

如果你想为每个类别和网站组合分别设置30行限制,这将会更加棘手,正如你当前的方法所提供的那样,但我倾向于怀疑LIMIT没有做到什么你想要它现在做,或者至少如果你有更多的数据就不会这样做。

已编辑添加:

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

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