1

私は3つのテーブルを持っています:

部品:

+-------+------------------+------+-----+---------+----------------+
| Field | Type             | Null | Key | Default | Extra          |
+-------+------------------+------+-----+---------+----------------+
| id    | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
+-------+------------------+------+-----+---------+----------------+
+----+
| id |
+----+
|  1 |
|  2 |
|  3 |
+----+

Parts_partid:

+-----------+------------------+------+-----+---------+-------+
| Field     | Type             | Null | Key | Default | Extra |
+-----------+------------------+------+-----+---------+-------+
| part_id   | int(10) unsigned | NO   | PRI | NULL    |       |
| partid_id | int(10) unsigned | NO   | PRI | NULL    |       |
+-----------+------------------+------+-----+---------+-------+
+---------+-----------+
| part_id | partid_id |
+---------+-----------+
|       1 |         1 |
|       1 |         2 |
|       1 |         3 |
|       2 |         1 |
|       2 |         4 |
|       2 |         5 |
|       3 |         6 |
|       3 |         7 |
|       3 |         8 |
+---------+-----------+

党派:

+-------+------------------+------+-----+---------+----------------+
| Field | Type             | Null | Key | Default | Extra          |
+-------+------------------+------+-----+---------+----------------+
| id    | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| key   | varchar(50)      | NO   | MUL | NULL    |                |
| value | varchar(50)      | NO   |     | NULL    |                |
+-------+------------------+------+-----+---------+----------------+
+----+-----+-------+
| id | key | value |
+----+-----+-------+
|  1 | l   | foo   |
|  2 | p   | bar   |
|  3 | s   | baz   |
|  4 | l   | 3     |
|  5 | p   | 5     |
|  6 | s   | r     |
|  7 | l   | rr    |
|  8 | l   | rrr   |
+----+-----+-------+

基本的に、各パーツは任意のパーツIDで構成されます。たとえば、パート#1にはl ='foo'、p ='bar'、s='baz'があります。

l ='foo'を持つすべての部分を検索したい場合は、この結合を使用します

SELECT p.id FROM parts AS p
INNER JOIN parts_partid ppi ON ppi.part_id = p.id
INNER JOIN partid pi ON ppi.partid_id = pi.id
WHERE pi.key = 'l' AND pi.value = 'foo';

それは私にパート#1と#2を与えます。

ここで、l='foo'およびp='5'を持つすべてのパーツを検索します(これにより、パーツ#2のみが生成されるはずです)。これどうやってするの?

4

2 に答える 2

0

これを試して....

SELECT p.id FROM parts AS p
INNER JOIN parts_partid ppi ON ppi.part_id = p.id
INNER JOIN partid pi ON ppi.partid_id = pi.id
WHERE (pi.key = 'l' AND pi.value = 'foo')
or    (pi.key ='p' and pi.value = '5')
于 2013-03-26T09:30:54.243 に答える
0

これを試して:

SELECT id
FROM
(
  SELECT 
    p.id,
    MAX(CASE WHEN pi.Key = 'l' THEN value END) AS l,
    MAX(CASE WHEN pi.Key = 'p' THEN value END) AS p,
    MAX(CASE WHEN pi.Key = 's' THEN value END) AS s
  FROM parts AS p
  INNER JOIN parts_partid ppi ON ppi.part_id = p.id
  INNER JOIN partid pi ON ppi.partid_id = pi.id
  GROUP BY p.id
) AS t
WHERE l = 'foo' 
  AND p = 5;

SQLフィドルデモ

これにより、part2のみが提供されます。

結果

| ID |
------
|  2 |

このクエリの背後にある考え方は、キーの値を列にピボットするサブクエリです。各IDのキーを列ヘッダーとして提供します。

| ID |   L |      P |      S |
------------------------------
|  1 | foo |    bar |    baz |
|  2 | foo |      5 | (null) |
|  3 | rrr | (null) |      r |

次に、外部クエリで、これらの列の値をフィルタリングできます。

于 2013-03-26T09:39:15.747 に答える