2015-03-03 177 views
0

我發現SQL相關的問題很難用對話表達,所以請原諒我,如果這沒有意義。MySQL查詢條件或子查詢

我正在將數據從CMS數據庫遷移到MySQL,我希望儘可能簡化數據結構。當前類別方案有7個類別並且具有項目到類別關係設置爲多對多,所以需要聯結表。

這會更好地設置爲兩個一對多的關係,以便不需要額外的表。實際類別設置我需要如下:

類別1

Option 1 
Option 2 

類別2

Option 3 
Option 4 
Option 5 
Option 6 
Option 7 

每個項目屬於用於Category 1一個值,以及用於一個值Category 2。這是我創建查詢的一般形式:

SELECT items.entry_id, categories.cat_id 
FROM items 
INNER JOIN categories 
ON items.entry_id = categories.entry_id 
WHERE items.item_type = 6 

我怎麼想補充一個條件或子查詢,使我得到了SELECT條款,如結果:

SELECT items.entry_id, categories.cat_id1, categories.cat_id2 

其中cat_id1cat_id2的值是上述值嗎?

**** ****更新我 取得了一些進展得到我所需要的查詢(表太複雜,張貼在這裏的例子,但在這裏是一個簡單的查詢):

SELECT exp_weblog_data.entry_id, 
exp_weblog_data.field_id_27 AS Title, 
exp_weblog_data.field_id_29, 
exp_weblog_data.field_id_32, 
exp_weblog_data.field_id_33, 
exp_weblog_data.field_id_28, 
exp_weblog_data.field_id_84, 
exp_relationships.rel_child_id, 
CASE WHEN exp_category_posts.cat_id = '15' OR exp_category_posts.cat_id = '16' THEN exp_category_posts.cat_id END as cat1, 
CASE WHEN exp_category_posts.cat_id = '17' OR exp_category_posts.cat_id = '20' THEN exp_category_posts.cat_id END as cat2 
FROM exp_weblog_data 
INNER JOIN exp_relationships 
ON exp_weblog_data.entry_id = exp_relationships.rel_parent_id 
INNER JOIN exp_category_posts 
ON exp_weblog_data.entry_id = exp_category_posts.entry_id 
WHERE exp_weblog_data.weblog_id = 6 

這讓我想到了Cat1和Cat2所需的兩列,但這裏仍然存在兩個問題--exp_category_posts上的內部連接導致每個記錄有2行,我只希望entry_id的每個值有一行。其次,在case語句中,如果cat_id = 15,我想設置A的值,如果cat_id = 16,則設置B的值,但我似乎無法找到正確的語法,而不會出錯。

我希望這可以清理一些東西!

+0

也許你可以拍一張你的桌子的照片,難以置信你只用文字 – marjes 2015-03-03 01:24:39

+0

樣本數據和理想的結果是解釋事物的好方法。 – 2015-03-03 01:40:00

+0

我同意,但這個CMS數據庫是一個巨大的混亂,它很難使用一個真正的例子,當我有100列,但只需要6或7個。我會嘗試弄清楚如何清除它。 – Ditchmonkey 2015-03-03 04:54:39

回答

0

設置多對多關係時沒有合理的方法來避免多餘的表。

不是有多個類別的多個列(cat_id1,cat_id2,...)。

不是將多個ID放在一個列中(「123,234,345」)。

這兩者都會導致比映射表更糟糕的問題。

+0

多對多關係是由cookie-cutter CMS數據庫結構設置的,不是必需的。我試圖得到適當的查詢以將類別重新放回到單個表中。 – Ditchmonkey 2015-03-03 04:52:36