mysql - mysql连接问题

标签 mysql sql join

我在研讨会和类别表之间有多对多的关系。

我有 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=&city=敖德萨&state=Odesska_Region&category=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 )

我打印了每一行。

问题是我从这个查询中得到:(workshop_matched_item) * 该研讨会的所有类别。

例如:如果一个研讨会匹配,并且该研讨会有 5 个类别,那么我会得到 5 行。但我需要 1 行包含此研讨会的 5 个类别。

我做错了什么?

最佳答案

workshop.id分组并使用GROUP_CONCAT()函数作为tie.category_id:

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 ...

有关 GROUP_CONCAT() 的详细信息,请参阅 MySQL 文档函数,例如您想要不同的分隔符而不是逗号,或者您想要定义列表中 category_id 的顺序。

<小时/>

注意:用于连接两个表的 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 条件放在 JOINed 表附近并与进一步的 WHERE 条件分开的优点之外,它也很有帮助,因为在许多情况下(例如这个),一个表(研讨会)中的一行可能不与任何行相关在第二个表(一个类别)中。这些研讨会不会与您拥有的代码一起显示(上面的 JOIN 示例也不会显示)。

但您可能仍然想向他们展示。使用 WHERE 语法,它会变得复杂。使用 JOIN 语法,您只需将 JOIN 更改为 LEFT JOIN (因此 workshop LEFT JOIN 绑定(bind)中 LEFT 表中的所有列 关系包括在内,而不仅仅是相关的关系)。

关于mysql - mysql连接问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6609245/

相关文章:

php - 如何在PHP中查找两个连续行中两个字段的差异?

php - 查询返回基于类别的重复产品

sql - 尝试删除 SQL 字符串末尾的 bit.ly URL

sql - 左外部连接未返回预期结果

MySQL - 在 A 列上联接表,除非 A 列 = x,然后在 b 列上联接

PHP/MySQL : Check whether email exists in database?

python - 如何在 Python 上的 Couchbase 中执行类似 "SELECT DISTINCT(HOSTNAME) from *"的查询

MySQL如何从一个列中获取数据并放入同一ID和同一表下的另一列

sql - 有没有办法找出提交 SQL 查询的用户?

mysql - 在 mysql 中的连接查询中无法获得不同的结果