2

我有三个用于存储一些用户数据的表。

sub_domains(体验子域在这里。匹配exp_id和匹配。所以如果用户有多个子域,则and可以重复)idexpdomain_ididmiscuser_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 获取数据的 atm 查询:

$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 = ?";

它几乎可以工作,子猫的 var_dump 只返回表中的第name一个misc

4

5 回答 5

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 = ?
于 2012-07-24T14:04:05.300 回答
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;
于 2012-07-27T14:18:31.100 回答
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 = ?
于 2012-07-24T14:04:13.190 回答
1

在研究了你的问题一段时间后,我能够弄清楚你在追求什么。

你可以试试这个解决方案:

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 = ?

虽然我有点困惑,如果表中已经引用了为什么你在表中有一个user_id列。对我来说,这似乎是可以消除的重复。sub_domainsuser_idexp

于 2012-07-29T02:11:51.507 回答
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 方法)中运行此查询。

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

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

于 2012-07-30T12:26:27.793 回答