2012-08-22 60 views
0

我有两个表课程和科目。这是一个一对多的比率在每节课可以在导致类似“名称”主题1个或多个科目进行分类:数学,科学,社会研究如何将多个表中的一条记录组合起来

这将返回3个记录:
名称,数学
名称,科学
名,社会科学

这导致我通过循环和组合以及打乱了我的搜索计数
我怎样才能得到一个记录所有三个呢?所以我的搜索计数是准确的,我不需要额外的PHP代码来检查名称是否相同并收集额外的主题?

我试过基本

SELECT * FROM lesson INNER JOIN subjects ON subject.id = lesson.subject 

但是这导致3项

编辑
我的查询更复杂,比我带领。我有一个中间表,用于跟踪上面的两个表格及其关系
此查询用于搜索。这是我的。

SELECT name, subject   
FROM lesson As l 
INNER JOIN lesson_sub As ls 
    ON ls.lesson_id = l.id 
INNER JOIN subjects As s 
    ON s.id = ls.subject_id 
WHERE CONCAT(l.name, s.subject) LIKE '%KEYWORD%' AND s.id = SUBJECT_ID 
+0

你有没有想过使用一个框架像[CakePHP的] (http://cakephp.org/)或[CodeIgnighter](http://codeignighter.com/)为您提供实用方法,为您实现这种事情? – tadman

回答

2

可以使用GROUP_CONCAT()函数与JOIN查询:

http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_group-concat

GROUP_CONCAT(expr)

该函数返回一个字符串结果,其中包含来自一个组的连接的非NULL 值。如果没有非NULL值,它将返回NULL。 完整的语法如下:

GROUP_CONCAT([DISTINCT] expr的[,... EXPR] [ORDER BY {UNSIGNED_INTEGER | COL_NAME | expr}的 [ASC | DESC] [,... COL_NAME]] [SEPARATOR str_val])

的MySQL> SELECT student_name, - > GROUP_CONCAT(test_score) - > FROM学生 - > GROUP BY student_name;

或者:

的mysql> SELECT student_name, - > GROUP_CONCAT(DISTINCT test_score - > ORDER BY test_score DESC SEPARATOR'“) - >从学生 - > GROUP BY student_name;

所以:

SELECT lesson.name, GROUP_CONCAT(subjects.name SEPARATOR ', ') 
    FROM lesson JOIN subjects ON (subject.id = lesson.subject) 
    GROUP BY lesson.name; 

TEST

CREATE TABLE lesson (name varchar (20), subject integer); 
CREATE TABLE subjects (id integer, name varchar(20)); 

INSERT INTO subjects VALUES (1, 'Math'), (2, 'Physics'), (3, 'Chemistry'); 

INSERT INTO lesson VALUES ('Lesson A', 1); 
INSERT INTO lesson VALUES ('Lesson A', 2); 
INSERT INTO lesson VALUES ('Lesson A', 3); 
INSERT INTO lesson VALUES ('Lesson B', 2); 
INSERT INTO lesson VALUES ('Lesson B', 3); 
INSERT INTO lesson VALUES ('Lesson C', 1); 

SELECT lesson.name, GROUP_CONCAT(subjects.name SEPARATOR ', ') 
    FROM lesson JOIN subjects ON (subjects.id = lesson.subject) 
    GROUP BY lesson.name; 

+----------+--------------------------------------------+ 
| name  | GROUP_CONCAT(subjects.name SEPARATOR ', ') | 
+----------+--------------------------------------------+ 
| Lesson A | Math, Chemistry, Physics     | 
| Lesson B | Chemistry, Physics       | 
| Lesson C | Math          | 
+----------+--------------------------------------------+ 
3 rows in set (0.00 sec) 

更复杂的TEST(具有中间表)

CREATE TABLE lesson (id integer, name varchar (20)); 
CREATE TABLE subjects (id integer, name varchar(20)); 
CREATE TABLE lesson_sub (lesson_id integer, subject_id integer); 

INSERT INTO subjects VALUES (1, 'Math'), (2, 'Physics'), (3, 'Chemistry'); 
INSERT INTO lesson VALUES (1, 'Lesson A'), (2, 'Lesson B'), (3, 'Lesson C'); 

INSERT INTO lesson_sub VALUES (1,1), (1,2),(1,3),(2,2),(2,3),(3,1); 

SELECT lesson.name, GROUP_CONCAT(subjects.name SEPARATOR ', ') AS subjects 
    FROM lesson_sub JOIN lesson ON (lesson.id = lesson_sub.lesson_id) 
        JOIN subjects ON (subjects.id = lesson_sub.subject_id) 
    WHERE CONCAT(lesson.name, subjects.name) LIKE '%Chem%' 
    GROUP BY lesson.name; 

SELECT name, subjects FROM (
    SELECT lesson.name, GROUP_CONCAT(subjects.name SEPARATOR ', ') AS subjects 
    FROM lesson_sub JOIN lesson ON (lesson.id = lesson_sub.lesson_id) 
        JOIN subjects ON (subjects.id = lesson_sub.subject_id) 
    GROUP BY lesson.name) AS lesson_clear 
    WHERE CONCAT(name, subjects) LIKE '%Chem%'; 

+----------+--------------------------------------------+ 
| name  | GROUP_CONCAT(subjects.name SEPARATOR ', ') | 
+----------+--------------------------------------------+ 
| Lesson A | Chemistry         | 
| Lesson B | Chemistry         | 
+----------+--------------------------------------------+ 
2 rows in set (0.00 sec) 

+----------+--------------------------+ 
| name  | subjects     | 
+----------+--------------------------+ 
| Lesson A | Physics, Math, Chemistry | 
| Lesson B | Physics, Chemistry  | 
+----------+--------------------------+ 
2 rows in set (0.00 sec) 
+0

当使用GROUP_CONCAT时,我正在使用组函数查询无效 –

+0

发布您正在使用的查询。用测试用例更新我的答案。 – LSerni

+0

非常棒!唯一的区别是我有很多列选择,如果我在外部做SELECT *选择它很好,但如果我做CONCAT(*)喜欢,那么它不起作用。任何想法CONCAT从内部选择返回的所有字段? –

0

为什么内连接,如果你只是想要主题名称?现在

SELECT subject 
FROM lesson 

,如果你想要的是至少有一个课科目,那么你可以简单地做

SELECT DISTINCT subject 
FROM lesson 
INNER JOIN subjects ON subject.id = lesson.subject 
0

它升像你这样的人希望每人有一个记录,那就是每name

这里有一个办法做到这一点:

 SELECT name, count(*) subject_count 
     FROM lesson 
    INNER JOIN subjects ON subject.id = lesson.subject 
    GROUP BY name 
    ORDER BY name 

如果需要在名字的记录中显示的主题,试试这个:

 SELECT name, 
      count(*) subject_count, 
      group_concat(subject) subjects 
     FROM lesson 
    INNER JOIN subjects ON subject.id = lesson.subject 
    GROUP BY name 
    ORDER BY name 
+0

小组是否在哪里工作? –

+0

当然'GROUP BY'与'WHERE'一起使用。 –

相关问题