2011-07-07 28 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