2012-09-21 80 views
-2

爲簡單起見,我將離開與問題無關的字段。限制固定數量類別的固定行數

我的表結構,

新聞

news_id | parent_category | child_category

類別

category_id | maincategory_name

子類別

subcategory_id | subcategory_name

因爲它已經很明顯,category_id鏈接到parent_idsubcategory_id鏈接到newschild_category


我有什麼權利現在

SELECT * 
FROM (

     SELECT news . * , @rn := 
     CASE WHEN @child_category = child_category 
     THEN @rn +1 
     ELSE 1 
     END AS rn, @child_category := child_category 
     FROM news, (

        SELECT @rn :=0, @child_category := NULL 
        ) AS vars 
         ORDER BY child_category 
        ) AS T1 

         LEFT JOIN category ON parent_category = category.category_id 
         LEFT JOIN subcategory ON child_category = 
         subcategory.subcategory_id 
         WHERE rn <=12 AND parent_category = (SELECT category_id FROM 
         category WHERE maincategory_name='ukraine') AND 
         child_category!= (SELECT `subcategory_id` FROM subcategory 
         WHERE `subcategory_name` = 'kiev') 
         ORDER BY category.category_id DESC 

上面的SQL工作和每個類別取12行。

問題 我現在面臨的問題是,查詢從每個類別中提取數據。我想限制這個類別的數字爲2或3.例如如果subcategory表中有8個子類別,它將從所有這些子類中獲取數據。我想限制提取限制,比如3(任何3個類別)。

我使用IN語句在以下試過,

SELECT * 
    FROM (

     SELECT news . * , @rn := 
     CASE WHEN @child_category = child_category 
     THEN @rn +1 
     ELSE 1 
     END AS rn, @child_category := child_category 
     FROM news, (

        SELECT @rn :=0, @child_category := NULL 
        ) AS vars 
         ORDER BY child_category 
        ) AS T1 

         LEFT JOIN category ON parent_category = category.category_id 
         LEFT JOIN subcategory ON child_category = 
         subcategory.subcategory_id 
         WHERE rn <=12 AND parent_category = (SELECT category_id FROM 
         category WHERE maincategory_name='ukraine') AND 
         child_category IN (2,4) 
         ORDER BY category.category_id DESC 

其中IN range將由一個子查詢檢索。在邏輯上,如果我將這個子查詢限制爲3個結果,我的工作就完成了。但事實證明,IN語句不支持子查詢中的LIMIT子句。

所以問題是,什麼是檢索數據(固定,但我已經想通了)從有限數量的類別解決方法。


sameple數據

新聞表

| news_id | parent_category | child_category 
| 1  |  1   |  1 
| 2  |  1   |  2 

分類表

| category_id | maincategory_name 
|  1  |  Ukraine 
|  2  |  Russia 
|  3  |  Belarus 

子類別表

| subcategory_id | subcategory_name 
|  1  |  Kiev 
|  2  |  Odessa 
|  3  |  Moscow 
|  4  |  Simferopol 
|  5  |  Dnipropetrovsk 

結果應該是這樣的.....

假設基輔,敖德薩,辛菲羅波爾和Dnipropetrovsk的進入maincategory 1即烏克蘭,我想2個大類不含基輔(即結果應包含辛菲羅波爾第聶伯河敖德薩第聶伯河敖德薩辛菲羅波爾

問題是,查詢將獲取所有3個類別(或更多如果可用),其中作爲我只想2(或3在t輸入法)。

進一步INFO


SQL撥弄

create table News(news_id int, parent_category int, child_category int); 
insert into News values (1,1,1), (2,1,2), (3,1,2), (4,1,4),(5,1,4), (6,1,5), (7,2,3), (8,1,5), (9,1,2); 
create table Category(category_id int, maincategory_name varchar(100)); 
insert into Category values (1, 'Ukraine'), (2, 'Russia'), (3, 'Belarus'); 
create table Subcategory (subcategory_id int, subcategory_name varchar(100)); 
insert into Subcategory values (1, 'Kiev'), (2, 'Odessa'), (3, 'Moscow'), (4, 'Simferopol'), (5, 'Dinipro'); 

樣本數據

enter image description here

GOAL

從上面的結果,我想實現如下:

  • 取導致只能從一個主種類(即烏克蘭在這裏,並刪除俄羅斯),但它可以很容易地完成,所以沒有那個部分的擔心。

  • 只抓取2個子類別(上面的設置包含3個子類別,敖德薩,辛菲羅波爾和第聶伯羅,我只需要其中的任何兩個)。我可以硬編碼它來檢索它,但我會在其他地方使用這個相同的查詢,所以硬編碼將失敗的目的。

  • 從上面提到的上述兩個子類別中,每個子類別應該獲得最多5行。 (我已經在我的問題的第一個查詢中實現了這一點)。

從上述2的要求,我沒有達到。 1和不。 3.我卡在哪裏的是2號。 從結果集中,我無法獲取僅包含2個子類別的結果。 和結果集輸出數據包含所有可用的類別。 (在這裏,只有3個子類別,所以結果包含全部3個。如果將有10個子卡,它將檢索所有10個子卡數據)。我現在希望現在更清楚一點。

+0

你能提供樣本數據嗎? – fancyPants

+0

@tombom樣本數據已添加。 – itachi

+0

@tombom更多信息已添加。 – itachi

回答

0

恐怕我可能仍然沒有得到你想要的。你爲什麼不簡單地使用GROUP BY

/* SELECT * FROM (*/ 
SELECT 
n.news_id, 
c.maincategory_name, 
sc.subcategory_name 
FROM 
News n 
INNER JOIN Category c ON n.parent_category = c.category_id 
INNER JOIN Subcategory sc ON n.child_category = sc.subcategory_id 
WHERE maincategory_name = 'Ukraine' 
GROUP BY maincategory_name, subcategory_name 
ORDER BY RAND() 
LIMIT 2 
/*)q1 INNER JOIN with_whatever ON q1.news_id = with_whatever.Id */ 

with_whatever擁有你想要得到的數據「最多5行應該從每個子類中獲得」。您的示例數據仍然不能反映這一點。這就是爲什麼我不確定,如果這是你要求的。

+0

我想我無法以清晰的方式解釋它。我感謝你的努力。爲了讓它更簡單,你可以在小提琴的問題中運行我的第二個查詢嗎?這是我想要的確切結果。唯一的問題是,在'IN'語句中,'(2,4)'應該來自子查詢(從引用到parentCategory的子類別表),而不是硬編碼。但是,我的子查詢不但返回2,而且還返回父貓下可用的所有子貓。我無法在「IN」子查詢中限制2個結果。 – itachi

+0

@itachi爲什麼2和4?那是什麼標準? – fancyPants

+0

2和4引用子類別表中的子類別標識。標準是選擇屬於主類別的任何2個子類別。但是每個子類別與主類別表有一對多的關係。因此,每一次都需要指定主類別....我想這種方法有一些麻煩的地方。可能是我需要重新考慮設計...... – itachi