我在尝试查找我目前需要的查询时遇到了一些困难。当不在同一张表的同一行内时获得结果
我会尝试尽可能地解释情况并尽可能缩短。
我有一个名为articles_properties的多对多表,它来自两个其他表的组合:文章和属性。这些表具有以下结构,最重要的列和一些示例:
Property table
-------------------------
| id | property_name|
| 1 | name |
| 2 | variations |
-------------------------
Article table
--------------
| id |
| A1 |
| A2 |
| A3 |
| A4 |
| A5 |
--------------
Article_properties table
--------------------------------------------------
| article_id | property_id | property_value |
| A1 | 1 | Pencil |
| A1 | 2 | A2, A3 |
| A2 | 1 | Pencil (blue) |
| A3 | 1 | Pencil (green) |
| A4 | 1 | Book |
| A5 | 1 | Tennis ball |
--------------------------------------------------
它基本上是你可以看到的。也许唯一不直观的是变体:它是确定文章不同变体的属性。例如,铅笔文章有两个变体:铅笔(蓝色)和铅笔(绿色),用列表property_value中的各自文章ID表示。
现在的问题是,我想从Article_properties表中获取除另一个属性变体内出现的所有文章之外的所有文章。这意味着我想得到如下结果:
Query result
--------------------------------------------------
| article_id | property_id | property_value |
| A1 | 1 | Pencil |
| A1 | 2 | A2, A3 |
| A4 | 1 | Book |
| A5 | 1 | Tennis ball |
--------------------------------------------------
我该如何做,同时尽可能保持简单和干净?目前,我有以下查询,预期其无法正常工作:
SELECT ap.* FROM article_properties ap
LEFT JOIN property p ON p.id = ap.property_id
WHERE (p.property_name = 'name' OR p.property_name = 'variations')
AND ap.property_value != ''
AND ap.property_value NOT LIKE CONCAT('%',ap.article_id,'%')
GROUP BY ap.article_id, ap.property_id
究竟是什么我的错误或我缺少什么?
谢谢你花时间回答。
你的第一个问题是(明显的)缺乏标准化 – Strawberry
“Article”表与这里的任何东西有什么关系? – Fred
您可能会考虑制作一个“变体”表格“A2,A3”不是有效的变体。 – Strawberry