【问题标题】:SQL query: where array is in arraySQL查询:数组在哪里
【发布时间】:2015-08-22 07:14:41
【问题描述】:

我在数据库中有示例数据:

id (int)   name (varchar)           parts (varchar)
1          some_element             wheel, bearing, hinge, servo
2          another_element          bearing, servo, lift
3          third_element            motor, wire

我想按部分过滤结果。例如: 我正在输入 wheel,servo - 没有结果

我正在输入 车轮、轴承、伺服、铰链 - 返回 some_element 记录

我正在输入 bearing、servo、lift、wheel、bearing、hinge - 它返回 some_elementanother_element

如何构造SQL查询?零件领域还有其他更好的数据类型吗?

【问题讨论】:

  • 你需要规范化你的数据。
  • 你用的是什么关系型数据库?

标签: sql arrays filtering


【解决方案1】:

进行一些规范化,以便您可以更轻松地编写查询并且不会出现此类异常。

你需要另一个结构,比如:

element

+----+---------------+
| id | name          |
+----+---------------+
|  1 | some_element  |
+----+---------------+
|  2 | another_elem  |
+----+---------------+
|  3 | third_elem    |
+----+---------------+

part

+----+----------+
| id | name     |
+----+----------+
|  1 | wheel    |
+----+----------+
|  2 | bearing  |
+----+----------+
|  3 | hinge    |
+----+----------+
|  4 | servo    |
+----+----------+
 etc..

另一个,例如element_parts,通过 m:n 关系连接另外两个

+----+---------+---------+
| id | elem_id | part_id |
+----+----------+--------+
|  1 | 1       | 1       |
+----+---------+---------+
|  2 | 1       | 2       |
+----+---------+---------+
|  3 | 1       | 3       |
+----+---------+---------+
|  4 | 2       | 3       |
+----+---------+---------+
|  5 | 2       | 4       |
+----+---------+---------+
 etc..

现在您可以编写查询来过滤包含(或需要)wheelservo 的元素(调整 this 问题的已接受答案):

select *
from element e
where 2 = (
    select count(distinct p.id)
    from element_parts ep
    inner join part p on p.id = ep.part_id
    where p.name in ('wheel', 'servo') 
    and ep.elem_id = e.id
);

【讨论】:

  • 就是这么简单!谢谢:)
  • 好吧,“更简单的查询编写”部分有点撒谎,当然你可以做一些正则表达式模式匹配魔法(比如LIKE),但这只是解决了问题。
猜你喜欢
  • 2017-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-19
  • 2011-08-22
  • 1970-01-01
相关资源
最近更新 更多