0

2 番目と 3 番目のテーブルの列から、下の最初のテーブルの 2 つの異なる列に結合しようとしています。

users.id を job_listings.id に結合して users.username を返し、job_listings.categories を job_categories.id に結合して区切り、FIND_IN_SET 経由で job_categories.description を返したい

job_listings
id    |  employer_id  |  categories
1     |       1       |  1,2
2     |       1       |  2

users
id    |  username  |  type
1     |    foo     |  employer
2     |    wat     |  employer

job_categories
id    |  description
1     |     fun
2     |     hak

次の形式の出力が必要です。

output
username  |    type    |  category  |  description
  foo     |  employer  |     1      |      fun
  foo     |  employer  |     2      |      hak
  foo     |  employer  |     2      |      hak

次のコードのさまざまな順列を使用してみました。

SELECT users.username, users.type, job_listings.categories FROM users
JOIN job_listings ON users.id
JOIN job_listings AS category ON FIND_IN_SET(category.categories, job_categories.id)
ORDER BY users.username, category.categories

同じテーブルで複数の JOIN 操作を使用するにはエイリアスを使用する必要があることを他の回答から知っていますが、他の回答を適応させたにもかかわらず、エイリアスの宣言に関連するエラーを受け取り続けたり、エイリアスを持つ列を持つ出力を返したりしますが、その列にはデータが返されません。

4

1 に答える 1

1

まず、設計を正規化する必要があります。文字列に整数値を格納しないでください。宣言できない外部キー参照を持つべきではありません。リストを文字列に格納しないでください。それは十分な理由ですか?JobCategoriesジョブごとに 1 行、カテゴリごとに 1 行のジャンクション テーブルが必要です。

時々、私たちは他の人々のお粗末な決定に行き詰まり、簡単に変更することができません. その場合、次のようなクエリが必要です。

SELECT u.username, u.type, jc.id, jc.category
FROM users u JOIN
     job_listings jl
     ON u.id = jl.employer_id and u.type = 'employer' join
     job_categories jc
     ON FIND_IN_SET(jc.id, j.categories) > 0
ORDER BY u.username, jc.category;

このクエリは、カテゴリ結合のインデックスを利用できません。つまり、遅くなります。適切なデータ構造 (ジャンクション テーブル) を使用すると、このパフォーマンスの問題を解決できます。

于 2015-06-21T19:32:55.743 に答える