2

ユーザーデータを保存するために使用される3つのテーブルがあります。

sub_domains(エクスペリエンスのサブドメインはここに移動します。exp_id一致idするexpと にdomain_id一致idmiscます。したがって、ユーザーが複数のサブドメインを持っている場合、user_idとが重複する可能性があります)exp_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 = ?";

それはほとんど機能します。subcats の 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メソッド)内でこのクエリを最初に実行してください。

で戻り値を取得し、Stringその(query1)Stringをメインクエリに入れますIN()

このタイプの DAO 操作から、期待どおりの答えが得られました。その助けがいっぱいであることを願っています。

于 2012-07-30T12:26:27.793 に答える