按列分组和排序但不在结果中包含该列

Group and order by a column but donot include that column in results

我一直在想办法修改这个查询,使结果集不包括 numHits。我想要相同顺序的相同结果,只是不包含 numHits。

SELECT 
    `newel_inventoryKeywordIdDictionaryId`.`inventoryId`
    ,COUNT(`newel_inventoryKeywordIdDictionaryId`.`inventoryId`) as numHits 
FROM 
    `newel_inventoryKeywordIdDictionaryId`
    , `newel_inventoryDictionary`
WHERE 
    `newel_inventoryKeywordIdDictionaryId`.`dicId` = `newel_inventoryDictionary`.`dicId` 
    AND ( 
        `newel_inventoryDictionary`.`word` = 'alabaster' OR `newel_inventoryDictionary`.`word` = 'chess'
    ) 
GROUP BY inventoryId 
ORDER BY numHits DESC;

示例结果:

inventoryId, numHits
6928, 2
6929, 2
6924, 2
6925, 2
13772, 2
6926, 2
18203, 1
6931, 1
13863, 1
18402, 1

期望的结果:

inventoryId
6928
6929
6924
6925
13772
6926
18203
6931
13863
18402

将列从 SELECT 子句移动到 ORDER BY 子句:

SELECT 
    `newel_inventoryKeywordIdDictionaryId`.`inventoryId`
FROM 
    `newel_inventoryKeywordIdDictionaryId`
    , `newel_inventoryDictionary`
WHERE 
    `newel_inventoryKeywordIdDictionaryId`.`dicId` = `newel_inventoryDictionary`.`dicId` 
    AND ( 
        `newel_inventoryDictionary`.`word` = 'alabaster' OR `newel_inventoryDictionary`.`word` = 'chess'
    ) 
GROUP BY inventoryId 
ORDER BY COUNT(`newel_inventoryKeywordIdDictionaryId`.`inventoryId`) DESC;
SELECT 
`newel_inventoryKeywordIdDictionaryId`.`inventoryId`
FROM 
`newel_inventoryKeywordIdDictionaryId`
, `newel_inventoryDictionary`
WHERE 
`newel_inventoryKeywordIdDictionaryId`.`dicId` = `newel_inventoryDictionary`.`dicId` 
AND ( 
    `newel_inventoryDictionary`.`word` = 'alabaster' OR `newel_inventoryDictionary`.`word` = 'chess'
) 
GROUP BY inventoryId 
ORDER BY COUNT(`newel_inventoryKeywordIdDictionaryId`.`inventoryId`) DESC;

您只需将聚合放在 ORDER BY 中。但是,您还应该:

  • 使用明确的 join 语法。 从不from 子句中使用逗号。
  • 使用table 别名。它们使查询更易于编写和阅读。
  • 使用 in 而不是一堆 or 语句。

这是查询的改进版本:

SELECT kdi.inventoryId
FROM newel_inventoryKeywordIdDictionaryId kdi JOIN
     newel_inventoryDictionary id
     ON kdi.dicId = id.dictId
WHERE id.word IN ('alabaster', 'chess') 
GROUP BY kdi.inventoryId 
ORDER BY COUNT(*) DESC;