MySQL查询如何从包含多个字符串值的列中获取所有不同值的列表?

时间:2012-12-20 21:13:37

标签: php mysql database

我试图从表格中的列中获取不同值的列表。 每列可以包含多个逗号分隔值。我只想消除重复值并提出一个唯一值列表。

我知道如何通过抓取整个表然后循环行并将唯一值放入一个唯一的数组中来使用PHP。

但是MySQL查询可以做同样的事情吗?

我的表看起来像这样:

| ID |                  VALUES                    |
---------------------------------------------------
| 1  |    Acadian,Dart,Monarch                    |
| 2  |    Cadillac,Dart,Lincoln,Uplander          |
| 3  |    Acadian,Freestar,Saturn                 |
| 4  |    Cadillac,Uplander                       |
| 5  |    Dart                                    |
| 6  |    Dart,Cadillac,Freestar,Lincoln,Uplander |

所以我的唯一VALUES列表将包含:

  • 阿卡迪亚
  • 凯迪拉克
  • 达特
  • Freestar
  • 林肯
  • 君主
  • 土星
  • UPLANDER

这可以单独使用MySQL调用,还是需要进行一些PHP排序?

由于

2 个答案:

答案 0 :(得分:2)

为什么要将这样的数据存储在数据库中?您故意取消了首先要使用数据库的所有广泛查询功能。相反,有一个这样的表:

| valueID | groupID |   name     |
----------------------------------
|    1    |    1    |  Acadian   |
|    2    |    1    |  Dart      |
|    3    |    1    |  Monarch   |
|    4    |    2    |  Cadillac  |
|    2    |    2    |  Dart      |

注意与马修的建议相比,valueID的{​​{1}}不同。那些具有相同值的具有相同的valueID(您可能希望稍后参考这些,并且您不想犯同样的错误,不再提前思考,是吗?)。然后使主键包含valueID和groupID。

然后,要回答您的实际问题,您可以通过此查询检索所有不同的值:

Dart

SELECT name FROM mytable GROUP BY valueID此处应该比GROUP BY表现更好,因为它不应该进行表扫描)

答案 1 :(得分:1)

我建议选择(并拆分)到临时表中,然后对其进行调用。

首先,MySQL http://blog.fedecarg.com/2009/02/22/mysql-split-string-function/中显然没有拆分功能(这已经有三年了,所以如果有变化,有人可以发表评论吗?)

将所有内容推入临时表并从那里进行选择。

如果有可能将这些结构分解为具有这种结构的表,那就更好了:

| ID |                  VALUES                    |AttachedRecordID |
---------------------------------------------------------------------
| 1  |    Acadian                                 |        1        |
| 2  |    Dart                                    |        1        |
| 3  |    Monarch                                 |        1        |
| 4  |    Cadillac                                |        2        |
| 5  |    Dart                                    |        2        |