0

这是我的数据

id          cost    cat         foreign     colours
--------------------------------------------------------   
385_white   99      swarovski   12          black;blue
386_white   99      swarovski   12          black;blue;green
387_white   99      swarovski   12          yellow;green
389_white   99      swarovski   12          white;silver
385_white   99      swarovski   12          silver

这是我的查询

$checkSQL=mysql_query("SELECT * FROM `products`");
while($r = mysql_fetch_assoc($checkSQL)) {

    echo '<ul class="ColourList">';
    $cols = explode( ';', $r['colours'] );
    foreach ( $cols as $col ){
        echo '<li class="' . $col . '">' . $col . '</li>';
    }
    echo '</ul>';
}

这基本上返回每条记录的颜色列表

<ul>
 <li>black</li>
 <li>blue</li>
</ul>

但是,我想为整个数据库中的每种颜色返回一个列表并按字母顺序排列。所以基本上得到所有行中的所有颜色,按 ABC 顺序将它们拆分到一个列表中,但没有它们重复 - 这可能与我的客户设置有关吗?只是需要一些方向?思考explode然后replace我们ORDER BY ASC命令?

4

3 回答 3

3

This is a nice example of what happens if you not normalize your database. At first it seems easy, but ones runs into trouble later.

Change your tables like this:

Products:

id          cost    cat         foreign     
--------------------------------------------   
385_white   99      swarovski   12     

ProductColors:

id          color_id     
----------------------
385_white   1                
385_white   2

Colors:

id          name     
----------------------
1           Black     
2           Blue

If you have a structure like this, it is very easy ro query the database for what you want.

Example:

To query all available colors:

select * from colors

To query all available colors for 385_white:

select * from productcolors where id = '385_white'
于 2012-10-02T08:25:23.003 回答
1

SQL 运行一次,所以这个

想用替换来爆炸,然后使用 ORDER BY ASC 命令?

无法完成。

试试这个 SQL

SELECT * FROM `products` ORDER BY colours GROUP BY colours

这将按字母顺序按颜色排序,然后按颜色分组将删除您正在谈论的重复项。

您还应该将数据重组为颜色的一对多关系,使用;分隔符是不好的,以后您会感到非常头疼。

于 2012-10-02T08:26:44.950 回答
0

如果您经常需要对您的“颜色”字段(除了用于原始显示的简单 SELECT * 之外)运行查询,这意味着您的字段应该设计为易于查询。

这意味着:不要在 1 个字段中存储多个条目,每次需要查询和提取内容时都会让您的生活变得困难。

相反,创建一个“颜色”表(color_id, colour_name)

和一个“ articlecolors ”表(article_id, colour_id)。

这样每篇文章仍然可以有多种颜色,并且添加新颜色变得更加容易。您将能够使用标准 SQL 运行关于文章颜色的任何查询:检索没有重复的颜色列表将像 'SELECT DISTINCT(colour_name) FROM colours' 一样简单

于 2012-10-02T08:30:17.680 回答