0

私がここでやろうとしているのは、特定の仕事に応募したか、特定の仕事にタグ付けされたすべての応募者を、仕事を選択してから検索するタグを選択することによって取得することです。これが私が使用しているSQLステートメントです。

SELECT ap.user_id, ap.job_id as jobId, date(app_date) AS appDate, count(*) AS `count`   ,jt.name AS title, a.*, ap.app_id
FROM applications ap
LEFT JOIN jobs j ON ap.job_id = j.job_id
LEFT JOIN job_titles jt ON jt.name = j.title
LEFT JOIN applicants a ON a.applicant_id = ap.user_id
LEFT JOIN applicant_tags at ON at.applicant_id = ap.user_id
LEFT JOIN tags t ON t.id = at.tag_id
WHERE ap.favorite = 1
AND LOWER(jt.name) = LOWER('fisherman')
AND (LOWER(t.name) = LOWER('confident')
OR LOWER(t.name) = LOWER('hard worker'))
GROUP BY ap.app_id
HAVING `count` = '2'
ORDER BY jt.name

ここでの問題は、その仕事に応募した応募者のみを取得し、そのタイプの仕事にタグ付けされた応募者を取得していないことです。求人名自体はタグとして保存されませんが、代わりに、次のようなapplicant_tagsテーブルを介して各応募者にリンクされます。

applicant_id | tag_id | job_id
34                0        4
34                4        0
34                0        5
32                7        0

Application_id は、アプリケーションの user_id、タグ ID による tag_id、および job_titles ID による job_id を介してアプリケーションにリンクします。tags テーブルと job_titles テーブルには、ID と名前しかありません。

タグテーブルは次のとおりです。

id | tag_id

job_titles テーブル:

id | name

申請者は、申請者のすべての個人情報 (電子メール、電話番号) と、外部キーとして使用されている Application_id を持っています。

アプリケーションとジョブの情報が多すぎて一覧表示できず、実際に使用されている列はごくわずかです。

アプリケーション テーブル

app_id | user_id | job_id | app_date | favorites .....

ジョブ テーブル

job_id | title | location | jobtype .....

応募者の tag_id は、job_id がある場合は 0 であり、その逆も同様です。タグ名とジョブ名はカンマ区切りの値として保存されるのではなく、applicant_id によって各応募者にリンクされた 1 つの行に単一の値として保存されます。jobs の job_id は、求人名ではなく、応募された求人の ID です。各応募者には、複数のタグを関​​連付けたり、複数のジョブ名を関連付けたりすることができます。タグ ステートメント LOWER(t.name) = LOWER(タグ名) は、検索で使用されているタグの数に基づいて追加されます。その情報とアプリケーションで呼び出されているものがページに表示されるため、私は応募者からすべてを取得しています。

applications ap は ap.job_id によってジョブにリンクされ、applicant_tags は ap.applicant_id = at.applicant_id によってリンクされ、申請者は ap.applicant_id = a.applicant_id によってリンクされます。

job_titles jt は、jt.name = j.title によって job j にリンクされ、j.id = at.job_id によって application_tags にリンクされます

tags t は、t.id = at.tag_id によって、applicant_tags にリンクされています

集計テーブルも使用できません。

では、jobs テーブルから job_titles テーブルではなく、applicant_tags テーブルから job_titles テーブルに、ジョブ名にリンクされているアプリケーションを取得するにはどうすればよいでしょうか?

-編集

SQL ステートメントをリファクタリングした後、すべての応募者が表示されますが、タグは表示されず、タグを検索しようとしても結果が返されません。

SELECT ap.user_id, jt.id as jobId, date(app_date) AS appDate, jt.name AS title,   count(*) AS `count`, at.*, a.*, ap.app_id, t.*    
FROM applications ap                                 
INNER JOIN applicants a ON ap.user_id = a.applicant_id
LEFT JOIN applicant_tags at ON at.applicant_id = a.applicant_id
LEFT JOIN tags t ON at.tag_id = t.id
LEFT JOIN job_titles jt ON at.job_id = jt.id
WHERE ap.favorite = '1'
AND LOWER(jt.name) = LOWER('fisherman')
GROUP BY ap.app_id
HAVING `count` = '1'
ORDER BY jt.name
4

2 に答える 2

0

やり方がわかった。IN 句でサブクエリを使用する必要がありました。

SELECT ap.user_id, jt.id as jobId, date(app_date) AS appDate, jt.name AS title, count(*) AS `count`, at.*, a.*,ap.app_id
FROM applications ap
LEFT JOIN jobs j ON ap.job_id = j.job_id
LEFT JOIN job_titles jt ON jt.name = j.title
LEFT JOIN applicants a ON a.applicant_id = ap.user_id
LEFT JOIN applicant_tags at ON at.applicant_id = ap.user_id
LEFT JOIN tags t ON t.id = at.tag_id
WHERE ap.favorite = 1
AND (
    LOWER(jt.name) = LOWER('fisherman') OR 'fisherman' IN(SELECT jt.name FROM applicant_tags at 
    LEFT JOIN job_titles jt ON at.job_id = jt.id 
    WHERE at.applicant_id = a.applicant_id))
AND (LOWER(t.name) = LOWER('confident')
    OR LOWER(t.name) = LOWER('hard worker'))
GROUP BY ap.app_id
HAVING `count` = '2'
ORDER BY jt.name

でも、助けてくれてありがとう!

于 2012-11-23T12:56:35.267 に答える
0

別のメモで、ネストされたクエリを見てみましょう....これは以下にあります... http://www.felixgers.de/teaching/sql/sql_nested_queries.html

このクエリに関しては、すべての応募者情報を 1 つの集計テーブルにまとめた方が簡単です。次に、ジョブIDを別のテーブルに結合するか、元のテーブルを使用し、インデックスを適切に追加して、タイムアウトにならないようにします...はるかに簡単です。

SELECT ap.user_id, ap.job_id as jobId, date(app_date) AS appDate, count(*) AS `count` ,jt.name AS title, `a.*` -- a.* is this necessary? It would help if you were explicit
FROM applications ap
LEFT JOIN jobs j ON ap.job_id = j.job_id --take all items from applications and puta  jobid to them
LEFT JOIN job_titles jt ON jt.name = j.title -- now you are trying to add a title to job from ANOTHER table while retaining all records from applications
LEFT JOIN applicants a ON a.applicant_id = ap.user_id --then you want the applicant that matches the criteria to each application record
LEFT JOIN applicant_tags at ON at.applicant_id = ap.user_id
LEFT JOIN tags t ON t.id = at.tag_id
WHERE ap.favorite = 1
AND LOWER(jt.name) = LOWER('fisherman')
AND (LOWER(t.name) = LOWER('confident')
OR LOWER(t.name) = LOWER('hard worker')) 
GROUP BY ap.app_id -- how are you grouping by something that is not being called?
HAVING `count` = '2' -- They need to have two records, does not matter if they are the same
ORDER BY jt.name -- This is fine

私のコメントは別として、これは実際には合法です。ただし、申請者情報の集計テーブルを作成し、そのテーブルで単一の結合を実行して、作業をより簡単にします。

使用しているテーブルは次のとおりです。

アプリケーションは、条件に基づいて Applicant に参加します

これらのテーブルの内部結合

Applicants_tags は、タグを使用して sample_tags タグのジョブに結合します -- これをジョブ テーブルの job_titles と結合します

于 2012-11-21T17:34:47.550 に答える