2013-02-28 218 views
0

我在我的数据库中有五个表与我一起工作。一切正常,直到我开始使用组concat从数据库中选择状态。在Mysql查询中使用GROUP_CONCAT

这些都是我的表:

  • main_jobs
  • sub_jobs
  • 类别
  • 状态
  • state_job_relationship

我的表创建的片段

create table if not exists category (
    id int(3) not null auto_increment, 
    parent int(5) not null, 
    name varchar(255) not null, 
    description text, 
    slug varchar(255), 
    level int (3), 
    PRIMARY KEY (id, slug)); 

create table if not exists state (
     id int(4) not null auto_increment, 
     country_id int(11) not null, 
     name varchar(255) not null, 
     PRIMARY KEY (id), 
     FOREIGN KEY (country_id) REFERENCES country (id))"; 

create table if not exists state_job_relationship (
     id int(4) not null auto_increment, 
     state_id int(4) not null, FOREIGN KEY (state_id) REFERENCES state (id), 
     job_id int(11) not null, FOREIGN KEY (job_id) REFERENCES sub_jobs (id), 
     PRIMARY KEY (id)); 

create table if not exists main_jobs (
      id int not null auto_increment, primary key(id), 
      company_name varchar(255), 
      job_title varchar(255)); 

create table if not exists sub_jobs (
      id int not null auto_increment, primary key(id), 
      parent_id int(11) not null, FOREIGN KEY (parent_id) REFERENCES main_jobs (id), 
      title varchar(255), 
      description text not null, 
      category int (3), FOREIGN KEY (category) REFERENCES category (id) 
      ); 

这是我想选择什么:

从子工作表中的职位名称,与相应的公司名称,并从main_jobs和类别表等细节。

所有运作良好,直到我需要选择每个sub_job属于这一格式的状态:状态1,状态2,状态3

select sub_jobs.id as kid, main_jobs.id as parentid, 
    company_name, sub_jobs.description, sub_jobs.title, 
    job_title, category.name as ind, 
    DATE_FORMAT($column_date,'%a, %e %b %Y %T') as d, 
    (select group_concat(name seperator ', ') 
    from state_job_relationship, state 
    where job_id= kid 
    and state.id=state_job_relationship.state_id 
    group by state.id) states 
from sub_jobs, category, main_jobs 
where category.id=sub_jobs.category 
    and main_jobs.id=sub_jobs.parent_id 
order by featured desc , $table.id desc 
limit 100; 

尝试上述查询,但它显示这个错误:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'seperator ', ') from state_job_relationship, state where job_id= kid and state.i' at line 1

请问我什么不对?

+0

请正确格式化你的问题,尤其是你试一下查询。它也会鼓励更多的人来帮助你。 – fancyPants 2013-02-28 11:32:05

回答

0

看起来您的错误是因为您在相关子查询中使用了alais kid。您应该将kid替换为sub_jobs.id。您还有seperator拼写错误。

所以,你的代码将是:

select s.id as kid, 
    m.id as parentid, 
    company_name, 
    s.description, 
    s.title, 
    job_title, 
    c.name as ind, 
    DATE_FORMAT($column_date,'%a, %e %b %Y %T') as d, 
    (select group_concat(name SEPARATOR ', ') 
    from state_job_relationship 
    inner join state 
    on state.id=state_job_relationship.state_id 
    where job_id= s.id 
    group by state.id) states 
from sub_jobs s 
inner join category c 
    on c.id=s.category 
inner join main_jobs m 
    on m.id=s.parent_id 
order by featured desc , $table.id desc 
limit 100; 

你会发现,我改变了你的语法使用ANSI JOIN语法,我使用aliasas的表。

其他建议,我将使用子查询,并加入到子查询:

select s.id as kid, 
    m.id as parentid, 
    company_name, 
    s.description, 
    s.title, 
    job_title, 
    c.name as ind, 
    DATE_FORMAT($column_date,'%a, %e %b %Y %T') as d, 
    st.states 
from sub_jobs s 
inner join category c 
    on c.id=s.category 
inner join main_jobs m 
    on m.id=s.parent_id 
left join 
(
    select job_id, state.id, group_concat(name SEPARATOR ', ') states 
    from state_job_relationship 
    inner join state 
    on state.id=state_job_relationship.state_id 
    group by state.id, job_id 
) st 
    on st.job_id= s.id 
order by featured desc , $table.id desc 
limit 100; 
+0

非常感谢您帮助我并格式化我的问题。上面的查询显示此错误:子查询返回多于一行 – 2013-02-28 11:42:50

+0

@OguguaBelonwu请参阅我的编辑 – Taryn 2013-02-28 11:45:45

+0

非常感谢!它如此接近!但是,即使我预期不仅仅是一个国家,它也只会显示每个子工作的状态。 – 2013-02-28 15:59:42