2011-07-07 55 views
0

我在研討會和類別表之間有許多關係。mysql加入問題

我有3個表格: 車間,類別,category_workshop_tie。

在category_workshop_tie我有車間和類別的ID。

category_workshop_tie:

category_id | workshop_id 

車間:

id | title 

類別:

id | name 

,我有代碼:

$this->db->query(' 
    SELECT workshop.*, tie.category_id 
    FROM `prefix_workshop` workshop, `prefix_category_workshop_tie` tie 
    WHERE ((workshop.title LIKE ? OR workshop.descr LIKE ?) AND workshop.city LIKE ? AND workshop.state LIKE ?) AND (workshop.id = tie.workshop_id) 
    ORDER BY `d_course`', '%'.($d['f'] ? $d['f'] : '').'%', '%'.($d['f'] ? $d['f'] : '').'%', '%'.($d['city'] != '0' ? str_replace('_', ' ', $d['city']) : '').'%', '%'.($d['state'] != '0' ? str_replace('_', ' ', $d['state']) : '').'%'); 

$ d等於$ _GET;
查詢字符串:F = &城市=敖德薩&狀態= Odesska_Region &類別= 0 & workshop_search_submit =提交輸出的 示例:

Array ([id] => 11 [title] => Hello worldicos [presenter] => Bill [hours] => 5.00 [d_course] => 2011-07-06 [d_course_end] => 0000-00-00 [location] => [city] => Odessa [state] => Odesska Region [cost] => 53.00 [descr] => dwqhhd whqdhwq yhhd qywhdy hyqh d [sponsor] => Microshka [contact] => Mirgorod [website] => http://mirgorod.us [dt_update] => 2011-07-07 08:44:15 [user_id] => 1 [addr] => Kominterna street 10 A [image] => [category_id] => 6) Array ([id] => 11 [title] => Hello worldicos [presenter] => Bill [hours] => 5.00 [d_course] => 2011-07-06 [d_course_end] => 0000-00-00 [location] => [city] => Odessa [state] => Odesska Region [cost] => 53.00 [descr] => dwqhhd whqdhwq yhhd qywhdy hyqh d [sponsor] => Microshka [contact] => Mirgorod [website] => http://mirgorod.us [dt_update] => 2011-07-07 08:44:15 [user_id] => 1 [addr] => Kominterna street 10 A [image] => [category_id] => 9) Array ([id] => 11 [title] => Hello worldicos [presenter] => Bill [hours] => 5.00 [d_course] => 2011-07-06 [d_course_end] => 0000-00-00 [location] => [city] => Odessa [state] => Odesska Region [cost] => 53.00 [descr] => dwqhhd whqdhwq yhhd qywhdy hyqh d [sponsor] => Microshka [contact] => Mirgorod [website] => http://mirgorod.us [dt_update] => 2011-07-07 08:44:15 [user_id] => 1 [addr] => Kominterna street 10 A [image] => [category_id] => 17) Array ([id] => 11 [title] => Hello worldicos [presenter] => Bill [hours] => 5.00 [d_course] => 2011-07-06 [d_course_end] => 0000-00-00 [location] => [city] => Odessa [state] => Odesska Region [cost] => 53.00 [descr] => dwqhhd whqdhwq yhhd qywhdy hyqh d [sponsor] => Microshka [contact] => Mirgorod [website] => http://mirgorod.us [dt_update] => 2011-07-07 08:44:15 [user_id] => 1 [addr] => Kominterna street 10 A [image] => [category_id] => 1) Array ([id] => 11 [title] => Hello worldicos [presenter] => Bill [hours] => 5.00 [d_course] => 2011-07-06 [d_course_end] => 0000-00-00 [location] => [city] => Odessa [state] => Odesska Region [cost] => 53.00 [descr] => dwqhhd whqdhwq yhhd qywhdy hyqh d [sponsor] => Microshka [contact] => Mirgorod [website] => http://mirgorod.us [dt_update] => 2011-07-07 08:44:15 [user_id] => 1 [addr] => Kominterna street 10 A [image] => [category_id] => 4) Array ([id] => 11 [title] => Hello worldicos [presenter] => Bill [hours] => 5.00 [d_course] => 2011-07-06 [d_course_end] => 0000-00-00 [location] => [city] => Odessa [state] => Odesska Region [cost] => 53.00 [descr] => dwqhhd whqdhwq yhhd qywhdy hyqh d [sponsor] => Microshka [contact] => Mirgorod [website] => http://mirgorod.us [dt_update] => 2011-07-07 08:44:15 [user_id] => 1 [addr] => Kominterna street 10 A [image] => [category_id] => 5) Array ([id] => 11 [title] => Hello worldicos [presenter] => Bill [hours] => 5.00 [d_course] => 2011-07-06 [d_course_end] => 0000-00-00 [location] => [city] => Odessa [state] => Odesska Region [cost] => 53.00 [descr] => dwqhhd whqdhwq yhhd qywhdy hyqh d [sponsor] => Microshka [contact] => Mirgorod [website] => http://mirgorod.us [dt_update] => 2011-07-07 08:44:15 [user_id] => 1 [addr] => Kominterna street 10 A [image] => [category_id] => 7) Array ([id] => 11 [title] => Hello worldicos [presenter] => Bill [hours] => 5.00 [d_course] => 2011-07-06 [d_course_end] => 0000-00-00 [location] => [city] => Odessa [state] => Odesska Region [cost] => 53.00 [descr] => dwqhhd whqdhwq yhhd qywhdy hyqh d [sponsor] => Microshka [contact] => Mirgorod [website] => http://mirgorod.us [dt_update] => 2011-07-07 08:44:15 [user_id] => 1 [addr] => Kominterna street 10 A [image] => [category_id] => 8) Array ([id] => 11 [title] => Hello worldicos [presenter] => Bill [hours] => 5.00 [d_course] => 2011-07-06 [d_course_end] => 0000-00-00 [location] => [city] => Odessa [state] => Odesska Region [cost] => 53.00 [descr] => dwqhhd whqdhwq yhhd qywhdy hyqh d [sponsor] => Microshka [contact] => Mirgorod [website] => http://mirgorod.us [dt_update] => 2011-07-07 08:44:15 [user_id] => 1 [addr] => Kominterna street 10 A [image] => [category_id] => 13) 

我print_r'ed每一行。

問題是我從這個查詢中得到:(workshop_matched_item)*這個研討會的所有類別。

例如:如果一個車間匹配,並且這個車間有5個類別,那麼我得到5行。但我需要1行5個類別的這個車間。

我在做什麼錯了?

+0

你能寫一些輸入數據的例子,你想得到的結果嗎? –

+0

更新的問題:) – Mirgorod

回答

2

集團通過workshop.id和使用tie.category_idGROUP_CONCAT()功能:

SELECT workshop.*, GROUP_CONCAT(tie.category_id) AS category_id 
FROM `prefix_workshop` workshop, `prefix_category_workshop_tie` tie 
WHERE ((workshop.title LIKE ? OR workshop.descr LIKE ?) 
    AND workshop.city LIKE ? AND workshop.state LIKE ?) 
    AND (workshop.id = tie.workshop_id) 
GROUP BY workshop.id 
ORDER BY ... 

查看MySQL的文檔進行GROUP_CONCAT()功能的細節一樣,如果你想有一個不同的分隔符,而不是逗號,或者你想定義的順序category_id s在列表中。


注意:用於連接兩個表的WHERE語法很舊。嘗試開始使用明確JOIN來代替:

SELECT workshop.*, GROUP_CONCAT(tie.category_id) AS category_id 
FROM `prefix_workshop` workshop 
    JOIN `prefix_category_workshop_tie` tie 
    ON workshop.id = tie.workshop_id 
WHERE (workshop.title LIKE ? OR workshop.descr LIKE ?) 
    AND workshop.city LIKE ? 
    AND workshop.state LIKE ? 
GROUP BY workshop.id 
ORDER BY ... 

而且具有JOIN連接表接近條件的優勢,因爲在許多情況下,進一步WHERE條件,它有助於分離(像這樣),從行一張桌子(一個工作間)根本不可能與第二個表(一個類別)中的任何一行有關。這些研討會將不會顯示您的代碼(以及上面的JOIN示例)。

但是你可能仍然想要展示它們。使用WHERE語法會變得複雜。使用JOIN語法,您只需將JOIN更改爲LEFT JOIN(因此workshop LEFT JOIN tie關係中的LEFT表中的所有列都包含在內,而不僅僅是相關的)。

1

它仍然不是完全清楚你想要什麼樣的格式在搜索結果中。

你可以使用MySQL GROUP_CONCAT()方法把所有類別ID合併成一個字符串,或許逗號分隔。

但是,我認爲,如果您打算將類別ID用於顯示以外的其他任何內容,那麼執行第二個查詢(僅針對ID)會更簡單且更實用 - 如下所示:

SELECT category_id 
FROM prefix_category_workshop_tie 
WHERE workshop_id = $workshopId 

如果你要使用的類別ID查詢類別表,那麼你並不需要的ID存儲在兩者之間,你可以這樣做:

SELECT category_id category.somevalue 
FROM category_workshop_tie 
    WHERE workshop_id = $workshopId 
LEFT JOIN category 
    ON category.id = category_id 

兩個假設$workshopId已從第一個查詢中設置。

+0

可以有數百個研討會。 – Mirgorod