[英]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.