【问题标题】:MySQL return all results without duplicating dataMySQL返回所有结果而不重复数据
【发布时间】:2023-03-16 18:21:01
【问题描述】:

这是我的数据

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 顺序将它们拆分到一个列表中,但没有它们重复 - 这可能与我的客户设置有关吗?只是需要一些方向?想explodereplace 然后我们使用ORDER BY ASC 命令?

【问题讨论】:

  • 是否允许数据库规范化?如果是这样,我建议创建两个新表:colors(colorId, colorName)products_colors(productId, colorId) 来关联产品和可用颜色。
  • 最好是使用正确的实体关系,没有字符串:(

标签: php mysql str-replace explode


【解决方案1】:

这是一个很好的例子,说明如果你不规范化你的数据库会发生什么。起初看起来很容易,但后来遇到了麻烦。

像这样改变你的表格:

产品:

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

产品颜色:

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'

【讨论】:

  • 这就是我们最终所做的。基本上标准化数据。无论如何,看到解决方案这样做会很有趣。
  • 您最终会爬取无穷无尽的数据。
【解决方案2】:

SQL 运行一次,所以这个

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

做不到。

试试这个 SQL

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

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

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

【讨论】:

  • GROUP BY colours 子句不会删除重复项。例如,以下值不同并创建颜色重复:black;blueblack;blue;green
  • 鉴于桌子的愚蠢性质,它是 OP 将得到的最好的。
  • @ADC 我们最终所做的基本上是标准化数据。无论如何,看到解决方案这样做会很有趣
【解决方案3】:

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

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

相反,创建一个“colours”表(colour_id, colour_name)

还有一个“articlecolors”表(article_id、color_id)。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-11
    • 1970-01-01
    • 1970-01-01
    • 2020-01-20
    • 1970-01-01
    • 2013-11-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多