2012-07-24 143 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操作中得到了我的預期答案。 希望它的幫助完整。