0

質問された場合は申し訳ありませんが、私が見つけた回答を自分の状況に関連付けることができませんでした.

この問題のために一時テーブルを作成しました。

describe temp;
+-----------+--------------+------+-----+---------+-------+
| Field     | Type         | Null | Key | Default | Extra |
+-----------+--------------+------+-----+---------+-------+
| id        | int(11)      | NO   |     | 0       |       |
| artist    | varchar(255) | NO   |     | NULL    |       |
| title     | varchar(255) | NO   |     | NULL    |       |
| id_genre  | int(11)      | NO   |     | NULL    |       |
| id_genre2 | int(11)      | NO   |     | NULL    |       |
+-----------+--------------+------+-----+---------+-------+

もう 1 つの関連テーブルは、ジャンルのリストです。

これら 2 つのクエリを組み合わせたクエリを作成したいと考えています。

select temp.title,genre.name
from temp
join genre on genre.id = temp.id_genre;

+------------------------+--------------+
| title                  | genre1       |
+------------------------+--------------+
| Tight Capris - 1958-B  | Rockabilly   |
| Endless Sleep - 1958-5 | MyFavourites |
| Daisy Mae - 1966       | Rockabilly   |
| Fire of love - 1966-58 | Rockabilly   |
| Stormy - 1963          | Pop          |
+------------------------+--------------+
5 rows in set (0.00 sec)

select temp.title,genre.name as genre2
from temp
join genre on genre.id = temp.id_genre2;

+------------------------+------------+
| title                  | genre2     |
+------------------------+------------+
| Tight Capris - 1958-B  | Rockabilly |
| Endless Sleep - 1958-5 | Rockabilly |
| Daisy Mae - 1966       | Rockabilly |
| Fire of love - 1966-58 | Rockabilly |
| Stormy - 1963          | Pop        |
+------------------------+------------+
5 rows in set (0.00 sec)

1 タイトルのジャンルの違いに注目してください: Endless Sleep

私は、genre.id をジャンルの名前に置き換えることを除いて、次のような結果を作成したいと思います。

+------------------------+----------+-----------+
| title                  | id_genre | id_genre2 |
+------------------------+----------+-----------+
| Tight Capris - 1958-B  |      163 |       163 |
| Endless Sleep - 1958-5 |      161 |       163 |
| Daisy Mae - 1966       |      163 |       163 |
| Fire of love - 1966-58 |      163 |       163 |
| Stormy - 1963          |       99 |        99 |
+------------------------+----------+-----------+
5 rows in set (0.00 sec)

ありがとう

4

3 に答える 3

1

それで、これはあなたが必要とするものですか?

SELECT
    title,
    genre1.name as genre1,
    genre2.name as genre2
FROM 
    temp
INNER JOIN genre as genre1
    ON genre1.id = id_genre
INNER JOIN genre as genre2
    ON genre2.id = id_genre2
于 2013-04-08T16:10:44.510 に答える
0

ジャンルテーブルを2回JOINする必要があるというStephanに同意します。ただし、INNER JOIN の代わりに LEFT JOIN を使用することをお勧めします。

SELECT  temp.title,
        a.name GenreA,
        b.Name GenreB
FROM    temp
        LEFT OUTER JOIN genre a 
            ON a.id = temp.id_genre
        LEFT OUTER JOIN genre b 
            ON b.id = temp.id_genre2

これは、id_genre 列の 1 つに NULL を持つ一時的なレコードがある場合、またはジャンル テーブルの行と一致しない ID を持つ場合に役立ちます。

追加した:

「特定のジャンルでさらにフィルタリングするにはどうすればよいですか。たとえば、genre1 = 'rockabilly' (これは機能しません)」:

で追加

HAVING genre1 = 'rockabilly'
于 2013-04-08T16:20:46.050 に答える