簡體   English   中英

MySQL基於兩個表選擇行

[英]MySQL select rows based on two tables

我正在嘗試基於其他兩個表數據進行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行限制。 如果可以使用一些查詢。

如果您不想分別查詢每個站點的每個類別,那么為什么要這樣做呢? 如果您只是從現在使用的查詢中省略了WHERE子句,那么它將一目了然地為您提供所有類別和網站的所有新聞,但LIMIT您已設置了30行LIMIT

如果您希望按照目前的方法為類別和網站的每個組合分別設置30行的限制,那么這將比較棘手,但是我傾向於懷疑LIMIT並沒有完全按照您現在的意願做,或至少如果您有更多數據則不會這樣做。

編輯添加:

如果正如您在評論中指出的那樣,如果您確實確實希望類別和站點的每種組合都限制為30行,那么對於mysql,我只能看到兩種選擇:

  • 通過連接您現在通過UNION ALL運算符執行的所有單個查詢,形成一個巨型查詢。 僅提交該查詢。 這可能是您最好的選擇,但您也可以
  • 如我首先建議的那樣,使用不帶WHERE子句的簡單查詢,並將行限制應用於node.js端。 通過按站點和類別另外訂購可以簡化此方法。 盡管這會導致查詢更簡單,但是它可能涉及許多行被傳輸然后被丟棄。

在我看來,您正在尋找笛卡爾積。 當您從兩個不同的表中選擇而不定義它們之間的關系時,會得到此結果。 因此,舉一個簡單的例子:

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 Fiddle示例。

您的SQL可能應該是這樣的:

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

假設您有兩個數組,而不僅僅是兩個值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM