Php 具有DISTINCT和ORDER BY的MySQL查询

Php 具有DISTINCT和ORDER BY的MySQL查询,php,mysql,sorting,Php,Mysql,Sorting,我的问题是: $result = $mysqli->query('SELECT DISTINCT SKU_SIZE_PART1 FROM SKU_DATA ORDER BY SKU_SIZE_PART1 DESC'); 现在,这对SKU尺寸零件1非常有效,但我还有两个零件需要抓取。现在,当我用逗号这样做:“SKU_SIZE_PART1,SKU_SIZE_PART2,SKU_SIZE

我的问题是:

$result = $mysqli->query('SELECT DISTINCT SKU_SIZE_PART1 
                          FROM SKU_DATA 
                          ORDER BY SKU_SIZE_PART1 DESC');
现在,这对SKU尺寸零件1非常有效,但我还有两个零件需要抓取。现在,当我用逗号这样做:“SKU_SIZE_PART1,SKU_SIZE_PART2,SKU_SIZE_PART3”时,DISTINCT不起作用,我得到了大量重复项,然后我不确定如何对查询排序,以便所有查询都按大小和描述排序


这有意义吗?我可以将该查询再重复两次,并有三个单独的查询,但我想知道如何用一个查询来完成此操作。

在多次阅读您的问题后,我想这可能就是您想要的:

SELECT SKU_SIZE_PART1 AS ssp
FROM SKU_DATA 
UNION
SELECT SKU_SIZE_PART2 AS ssp
FROM SKU_DATA 
UNION
SELECT SKU_SIZE_PART3 AS ssp
FROM SKU_DATA 
ORDER BY ssp DESC

在多次阅读您的问题后,我想这可能就是您想要的:

SELECT SKU_SIZE_PART1 AS ssp
FROM SKU_DATA 
UNION
SELECT SKU_SIZE_PART2 AS ssp
FROM SKU_DATA 
UNION
SELECT SKU_SIZE_PART3 AS ssp
FROM SKU_DATA 
ORDER BY ssp DESC

DISTINCT选择一组不同的行,而不是列。。。这里的假设/问题是如何压缩多个列。如果你有下表

  sku1 | sku2 | sku3
 ---------------------
    a  |   a  |  b
    b  |   b  |  b
告诉它选择destinct将返回两行,因为它们都不不同,您不能删除第三列,因为这样行数据将不一致。如果希望所有内容都在一个表中,可以通过子查询来实现

 SELECT (SELECT DISTINCT SKU_SIZE_PART1 FROM SKU_DATA ORDER BY SKU_SIZE_PART1 DESC)
 as part1, (SELECT DISTINCT SKU_SIZE_PART2 FROM SKU_DATA ORDER BY SKU_SIZE_PART2 DESC)      
 as part2, (SELECT DISTINCT SKU_SIZE_PART3 FROM SKU_DATA ORDER BY SKU_SIZE_PART1 DESC)  
 as part3 FROM SKU_DATA

您可以稍微阅读一下DISTINCT的工作原理,看看为什么不能只选择DISTINCT SKU_SIZE_PART1、PART2、PART3。类似于

DISTINCT的地方选择一组不同的行,而不是列。。。这里的假设/问题是如何压缩多个列。如果你有下表

  sku1 | sku2 | sku3
 ---------------------
    a  |   a  |  b
    b  |   b  |  b
告诉它选择destinct将返回两行,因为它们都不不同,您不能删除第三列,因为这样行数据将不一致。如果希望所有内容都在一个表中,可以通过子查询来实现

 SELECT (SELECT DISTINCT SKU_SIZE_PART1 FROM SKU_DATA ORDER BY SKU_SIZE_PART1 DESC)
 as part1, (SELECT DISTINCT SKU_SIZE_PART2 FROM SKU_DATA ORDER BY SKU_SIZE_PART2 DESC)      
 as part2, (SELECT DISTINCT SKU_SIZE_PART3 FROM SKU_DATA ORDER BY SKU_SIZE_PART1 DESC)  
 as part3 FROM SKU_DATA

您可以稍微阅读一下DISTINCT的工作原理,看看为什么不能只选择DISTINCT SKU_SIZE_PART1、PART2、PART3。像这样的地方,我不确定我是否理解你的意图,但听起来你可能真的想要这样的东西:

SELECT SKU_SIZE_PART1 AS SKU_SIZE_PART
  FROM SKU_DATA
UNION
SELECT SKU_SIZE_PART2 AS SKU_SIZE_PART
  FROM SKU_DATA
UNION
SELECT SKU_SIZE_PART3 AS SKU_SIZE_PART
  FROM SKU_DATA
 ORDER BY SKU_SIZE_PART DESC
SELECT d.sku_size_part1, d.sku_size_part2, d.sku_size_part3 
FROM sku_data d
WHERE d.id IN (
  SELECT s.id   <<--- replace `id` with the real primary-key for table `sku_data`
  FROM sku_data s 
  GROUP BY s.sku_size_part1
  HAVING s.sku_size_part2 = MIN(s.sku_size_part2) 
     AND s.sku_size_part3 = MIN(s.sku_size_part3))
ORDER BY d.sku_size_part1 DESC

它将在一列中返回所有不同的SKU\u SIZE\u PART1/2/3值,而不是在三列中返回所有不同的(SKU\u SIZE\u PART1、SKU\u SIZE\u PART2、SKU\u SIZE\u PART3)三元组。

我不确定我是否理解您的意图,但听起来您可能真的想要这样的东西:

SELECT SKU_SIZE_PART1 AS SKU_SIZE_PART
  FROM SKU_DATA
UNION
SELECT SKU_SIZE_PART2 AS SKU_SIZE_PART
  FROM SKU_DATA
UNION
SELECT SKU_SIZE_PART3 AS SKU_SIZE_PART
  FROM SKU_DATA
 ORDER BY SKU_SIZE_PART DESC
SELECT d.sku_size_part1, d.sku_size_part2, d.sku_size_part3 
FROM sku_data d
WHERE d.id IN (
  SELECT s.id   <<--- replace `id` with the real primary-key for table `sku_data`
  FROM sku_data s 
  GROUP BY s.sku_size_part1)
ORDER BY d.sku_size_part1 DESC
SELECT d.sku_size_part1, d.sku_size_part2, d.sku_size_part3 
FROM sku_data d
WHERE d.id IN (
  SELECT s.id   <<--- replace `id` with the real primary-key for table `sku_data`
  FROM sku_data s 
  GROUP BY s.sku_size_part1
  HAVING s.sku_size_part2 = MIN(s.sku_size_part2) 
     AND s.sku_size_part3 = MIN(s.sku_size_part3))
ORDER BY d.sku_size_part1 DESC
它将在一列中返回所有不同的SKU\u大小\u PART1/2/3值,而不是在三列中返回所有不同的(SKU\u大小\u PART1、SKU\u大小\u PART2、SKU\u大小\u PART3)三元组

SELECT d.sku_size_part1, d.sku_size_part2, d.sku_size_part3 
FROM sku_data d
WHERE d.id IN (
  SELECT s.id   <<--- replace `id` with the real primary-key for table `sku_data`
  FROM sku_data s 
  GROUP BY s.sku_size_part1)
ORDER BY d.sku_size_part1 DESC
或者你想要@bfavaretto的联合变量



或者你想要@bfavaretto的联合变体。

可能是@DaOgre的复制品,你为什么要?Distinct应用于结果记录,而不是每个字段。
Distinct
应用于所有列,因此只有3列值相同的重复项才会被过滤掉。在ORDER BY上,您可以添加任意数量的列。请记住,
DISTINCT
作为一个集合应用于整个列分组,而不是单独应用于每个列。可能重复@DaOgre,您为什么要这样做?Distinct应用于结果记录,而不是每个字段。
Distinct
应用于所有列,因此只有3列值相同的重复项才会被过滤掉。在ORDER BY上,您可以添加任意数量的列。请记住,
DISTINCT
作为一个集合应用于整个列分组,而不是单独应用于每个列。-1,这将混合和匹配随机
sku大小\u部分
s,这些部分甚至不是来自同一行。非常糟糕的代码。-1,这将混合和匹配随机
sku\u大小\u零件
s,这些零件甚至不是来自同一行。非常糟糕的代码。这将生成大量重复的代码,您的意思是
selectdistinct。。。联合选择不同的。。。union select distinct
对吗?我知道这是不必要的
UNION
是隐式的
DISTINCT
(不同于
UNION ALL
)。查看选择之间的差异,而不是选择内部的差异。这将生成大量重复项,您的意思是
selectdistinct。。。联合选择不同的。。。union select distinct
对吗?我知道这是不必要的
UNION
是隐式的
DISTINCT
(不同于
UNION ALL
)。看到选择之间的区别,而不是选择内部的区别。@Johan:不,它不会;联合意味着不同。(也许你想的是全联盟?@Johan:对不起,你错了。工会的行为不像你想象的那样。(至少在我熟悉的RDBMS中,包括MySQL,这显然是Drew正在使用的);我邀请你也这样做。@Johan:不,不会的;联合意味着不同。(也许你想的是全联盟?@Johan:对不起,你错了。工会的行为不像你想象的那样。(至少在我熟悉的RDBMS中,包括MySQL,这显然是Drew正在使用的);我邀请你也这样做。