MySQL返回所有结果而不复制数据

时间:2012-10-02 08:19:45

标签: php mysql str-replace explode

这是我的数据

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命令思考?

3 个答案:

答案 0 :(得分:3)

如果未规范化数据库,会发生什么情况。起初它似乎很容易,但后来遇到了麻烦。

像这样更改你的表:

产品:

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

ProductColors:

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

颜色:

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

如果您有这样的结构,那么很容易在数据库中查询您想要的内容。

示例:

查询所有可用颜色:

select * from colors

查询385_white的所有可用颜色:

select * from productcolors where id = '385_white'

答案 1 :(得分:1)

SQL运行一次,所以

  

思考用replace替换,然后使用ORDER BY ASC命令?

无法完成。

试试这个SQL

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

这将按字母顺序排序,然后按颜色分组将删除您所说的重复项。

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

答案 2 :(得分:0)

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

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

相反,请创建“颜色”表格(colour_id,colour_name)

和' articlecolors '表(article_id,colour_id)。

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