2012-07-24 118 views
2

我有三个表用于存储一些用户数据。Mysql - 三表查询

sub_domains(经验子域去这里。exp_id比赛idexpdomain_id比赛idmisc。所以user_idexp_id可重复的,如果一个用户拥有多个子域)

+-----------+---------+------+-----+---------+----------------+ 
| Field  | Type | Null | Key | Default | Extra   | 
+-----------+---------+------+-----+---------+----------------+ 
| id  | int(11) | NO | PRI | NULL | auto_increment | 
| user_id | int(50) | YES |  | NULL |    | 
| domain_id | int(10) | NO |  | NULL |    | 
| exp_id | int(50) | YES |  | NULL |    | 
+-----------+---------+------+-----+---------+----------------+ 

misc

+----------+--------------+------+-----+---------+----------------+ 
| Field | Type   | Null | Key | Default | Extra   | 
+----------+--------------+------+-----+---------+----------------+ 
| id  | int(11)  | NO | PRI | NULL | auto_increment | 
| name  | varchar(100) | YES |  | NULL |    | 
| category | varchar(255) | YES |  | NULL |    | 
+----------+--------------+------+-----+---------+----------------+ 

exp

+------------+--------------+------+-----+---------+----------------+ 
| Field  | Type   | Null | Key | Default | Extra   | 
+------------+--------------+------+-----+---------+----------------+ 
| id   | int(11)  | NO | PRI | NULL | auto_increment | 
| user_id | int(11)  | YES |  | NULL |    | 
| job_type | varchar(60) | YES |  | NULL |    | 
| experience | varchar(500) | YES |  | NULL |    | 
| exp_title | varchar(255) | YES |  | NULL |    | 
| domain  | varchar(125) | YES |  | NULL |    | 
| start  | varchar(20) | YES |  | NULL |    | 
| end  | varchar(20) | YES |  | NULL |    | 
+------------+--------------+------+-----+---------+----------------+ 

这是查询我有个大气压,从EXP抓取数据:

$query_str = "SELECT a.id, a.user_id, a.job_type, a.experience, a.exp_title, a.domain,  a.start, a.end, b.name 
FROM exp a 
JOIN misc b ON a.domain=b.id 
WHERE a.user_id = ?"; 

我已经从misc获取域名,但我也想从misc每个子域的名称也是,但我不知道如何改变查询。

编辑

我曾在这一点,本想出了:

$query_str = "SELECT a.id, a.user_id, a.job_type, a.experience, a.exp_title, a.domain, a.start, a.end, b.name, 
(SELECT GROUP_CONCAT(domain_id) FROM sub_domains sd WHERE a.id=sd.exp_id) AS subs, 
(SELECT GROUP_CONCAT(name) FROM misc WHERE id IN(subs)) AS subcats 
FROM exp a 
JOIN misc b ON a.domain=b.id 
WHERE a.user_id = ?"; 

它几乎工程,subcats的的var_dump只返回misc表中的第一name

回答

1

学习你的问题了一段时间后,我能弄清楚你是什么之后。虽然我有点困惑,为什么你在sub_domains表中的列user_id如果user_idexp表中已经引用

SELECT  
    a.*, 
    b.name AS domain_name, 
    c.subdomain_names 
FROM 
    exp a 
LEFT JOIN 
    misc b ON a.domain = b.id 
LEFT JOIN 
(
    SELECT aa.exp_id, GROUP_CONCAT(bb.name) AS subdomain_names 
    FROM  sub_domains aa 
    JOIN  misc bb ON aa.domain_id = bb.id 
    GROUP BY aa.exp_id 
) c ON a.id = c.exp_id 
WHERE 
    a.user_id = ? 

你可以试试这个解决方案。对我来说,这似乎是一个可以消除的重复。

2

这应该工作:

SELECT a.id, a.user_id, a.job_type, a.experience, a.exp_title, a.domain, a.start, a.end, b.name 
FROM exp a 
    INNER JOIN misc b 
     ON a.domain=b.id 
    INNER JOIN sub_domains c 
     ON a.id=c.exp_id 
WHERE a.user_id = ? 
+0

不......它只是返回4或5每个经验。 – Ciprian 2012-07-24 14:32:37

+0

如果您想要表a中的所有记录,则尝试使用LEFT JOIN而不是INNER JOIN。 – Omesh 2012-07-25 07:57:58

1

简单地扩展您的当前查询:

SELECT a.id, a.user_id, a.job_type, a.experience, 
     a.exp_title, a.domain, a.start, a.end, b.name, c.id 
FROM exp a 
JOIN misc b ON a.domain = b.id 
JOIN sub_domains c ON c.domain_id = b.id 
WHERE a.user_id = ? 
+0

这不会返回任何东西。 :( – Ciprian 2012-07-24 14:32:51

2

不知道到底你以后,但是这可能会有帮助。由于您没有执行外键,所以使用了LEFT JOIN。

select exp.id, exp.user_id, exp.job_type, exp.experience, exp.exp_title, 
     exp.domain, exp.start, exp.end, 
     GROUP_CONCAT(misc.name) as sub_domain_names 
from exp 
left join sub_domains 
    on (exp.id = sub_domains.exp_id) 
left join misc 
    on (sub_domains.domain_id = misc.id) 
where exp.user_id = ? 
group by exp.id, exp.user_id, exp.job_type, exp.experience, exp.exp_title, 
     exp.domain, exp.start, exp.end; 
0

我有同样的问题。由于您的查询很好,而且运作良好。但是,您需要使用GROUP_CONCAT()方法显示所有名称。

不幸的是它只显示名字。是吗 ?

请检查您的IN()条件,如果你手动将值内IN

IN('1,2,3')也,它会显示你的名字。

解决方案: -

让您的查询相同,以及它。但是,下面的线从查询分离:

String query1= SELECT GROUP_CONCAT(domain_id) FROM sub_domains sd WHERE a.id=sd.exp_id 

之前执行你的主查询先运行此查询,DAO类(你DAO方法)内。

获取String中的返回值,然后将该(query1)String放入您的主要查询IN()中。

我从这种类型的DAO操作中得到了我的预期答案。 希望它的帮助完整。