草庐IT

MySQl GROUP BY 和 ORDER BY 没有做我想做的事

coder 2023-10-12 原文

我想在对结果进行分组之前对其进行排序,但我似乎无法完成。

我有这个问题:

SELECT DISTINCT
 product.id,
 product_number_value.att_value AS product_number,
 color_number_value.option_code AS color_number,
 size_value.option_code AS size_code,
 size_value.option_position AS size_position
FROM
 product
INNER JOIN product_attribute_relational AS product_number_relational ON product_number_relational.product_id = product.id
INNER JOIN product_att_varchar AS product_number_value ON product_number_relational.product_att_id = product_number_value.product_att_id
INNER JOIN product_attribute_relational AS color_number_relational ON color_number_relational.product_id = product.id
INNER JOIN product_att_select AS color_number_select ON color_number_relational.product_att_id = color_number_select.product_att_id
INNER JOIN attribute_option_value AS color_number_value ON color_number_select.att_value = color_number_value.option_id
INNER JOIN product_attribute_relational AS size_relational ON product.id = size_relational.product_id
INNER JOIN product_att_select AS size_select ON size_relational.product_att_id = size_select.product_att_id
INNER JOIN attribute_option_value AS size_value ON size_select.att_value = size_value.option_id
WHERE
 product_number_relational.att_id = 1 AND
 color_number_relational.att_id = 2 AND
 size_relational.att_id = 3 AND
 product.id IN (365, 366, 367, 368, 369, 371, 372, 373, 374)
ORDER BY
 product.id ASC

结果如下表:

id  product_number  color_number  size_code  size_position
365 F23740   311    S   24
366 F23740   311    M   25
367 F23740   311    L   26
368 F23740   311    XL   27
369 F23740   311    XS   23
371 F23745   213    S   24
372 F23745   213    M   25
373 F23745   213    L   26
374 F23745   213    XL   27

如果我按 product_number、color_number 分组,我会得到 id 365 和 371。
但我想获得 id 369 和 371,因为我希望结果在对它们进行分组之前首先按 size_position 排序。

我真的不知道如何完成这项工作?!??

有人可以帮我吗??

谢谢!

最佳答案

这是在分组查询中使用非分组列的问题。一般来说,这是要避免的事情。一些数据库引擎阻止您这样做,因为它没有逻辑意义 - 如果我想要一个组的 product.id,但数据库引擎应该选择哪个,因为单个组有多个选项?

ORDER BY 仅适用于使用 GROUP BY 时的聚合或分组列,但我不确定您是否可以轻松聚合。您正在查找组内具有 MIN(size_position) 的行的 product.id。我认为为每个组隔离这一行的子查询可能是唯一的方法;我想不出一个简单的方法来解决这个问题。

编辑

在这些情况下,我的直觉总是分两步进行。我不喜欢带有嵌套子查询的庞大笨重的查询,只是因为我发现它们不可读。您在规范化模式上有一个非常长的查询,所以我不会尝试在这里分解查询,我很可能会犯错误。

查询 1 会将 product_number、color_number 和 MIN(size_position)(按 product_number、color_number 分组)推送到临时表中。

查询 2 然后会检索临时表中每个产品编号、颜色编号、尺寸位置的产品编号。这样您就可以直接针对最小尺寸位置进行连接。

在许多情况下,使用临时表的负面性能被夸大了(不是全部,但肯定是我在过去 10 年中在交易应用程序中进行的 99% 的查询)。

还有另一种可能性涉及子查询自连接,但由于模式高度规范化,我认为实现起来并不是特别有利。

关于MySQl GROUP BY 和 ORDER BY 没有做我想做的事,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3466778/

有关MySQl GROUP BY 和 ORDER BY 没有做我想做的事的更多相关文章

  1. ruby - 难道Lua没有和Ruby的method_missing相媲美的东西吗? - 2

    我好像记得Lua有类似Ruby的method_missing的东西。还是我记错了? 最佳答案 表的metatable的__index和__newindex可以用于与Ruby的method_missing相同的效果。 关于ruby-难道Lua没有和Ruby的method_missing相媲美的东西吗?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/7732154/

  2. ruby-on-rails - rails 目前在重启后没有安装 - 2

    我有一个奇怪的问题:我在rvm上安装了ruby​​onrails。一切正常,我可以创建项目。但是在我输入“railsnew”时重新启动后,我有“程序'rails'当前未安装。”。SystemUbuntu12.04ruby-v"1.9.3p194"gemlistactionmailer(3.2.5)actionpack(3.2.5)activemodel(3.2.5)activerecord(3.2.5)activeresource(3.2.5)activesupport(3.2.5)arel(3.0.2)builder(3.0.0)bundler(1.1.4)coffee-rails(

  3. ruby - 在没有 sass 引擎的情况下使用 sass 颜色函数 - 2

    我想在一个没有Sass引擎的类中使用Sass颜色函数。我已经在项目中使用了sassgem,所以我认为搭载会像以下一样简单:classRectangleincludeSass::Script::FunctionsdefcolorSass::Script::Color.new([0x82,0x39,0x06])enddefrender#hamlengineexecutedwithcontextofself#sothatwithintemlateicouldcall#%stop{offset:'0%',stop:{color:lighten(color)}}endend更新:参见上面的#re

  4. 没有类的 Ruby 方法? - 2

    大家好!我想知道Ruby中未使用语法ClassName.method_name调用的方法是如何工作的。我头脑中的一些是puts、print、gets、chomp。可以在不使用点运算符的情况下调用这些方法。为什么是这样?他们来自哪里?我怎样才能看到这些方法的完整列表? 最佳答案 Kernel中的所有方法都可用于Object类的所有对象或从Object派生的任何类。您可以使用Kernel.instance_methods列出它们。 关于没有类的Ruby方法?,我们在StackOverflow

  5. ruby-on-rails - Rails 3,嵌套资源,没有路由匹配 [PUT] - 2

    我真的为这个而疯狂。我一直在搜索答案并尝试我找到的所有内容,包括相关问题和stackoverflow上的答案,但仍然无法正常工作。我正在使用嵌套资源,但无法使表单正常工作。我总是遇到错误,例如没有路线匹配[PUT]"/galleries/1/photos"表格在这里:/galleries/1/photos/1/edit路线.rbresources:galleriesdoresources:photosendresources:galleriesresources:photos照片Controller.rbdefnew@gallery=Gallery.find(params[:galle

  6. ruby-on-rails - 有没有办法为 CarrierWave/Fog 设置上传进度指示器? - 2

    我在Rails应用程序中使用CarrierWave/Fog将视频上传到AmazonS3。有没有办法判断上传的进度,让我可以显示上传进度如何? 最佳答案 CarrierWave和Fog本身没有这种功能;你需要一个前端uploader来显示进度。当我不得不解决这个问题时,我使用了jQueryfileupload因为我的堆栈中已经有jQuery。甚至还有apostonCarrierWaveintegration因此您只需按照那里的说明操作即可获得适用于您的应用的进度条。 关于ruby-on-r

  7. ruby - 没有类方法获取 Ruby 类名 - 2

    如何在Ruby中获取BasicObject实例的类名?例如,假设我有这个:classMyObjectSystem我怎样才能使这段代码成功?编辑:我发现Object的实例方法class被定义为returnrb_class_real(CLASS_OF(obj));。有什么方法可以从Ruby中使用它? 最佳答案 我花了一些时间研究irb并想出了这个:classBasicObjectdefclassklass=class这将为任何从BasicObject继承的对象提供一个#class您可以调用的方法。编辑评论中要求的进一步解释:假设你有对象

  8. ruby - 没有轨道的 ActiveRecord 时区 - 2

    我在非Rails项目中使用ActiveRecord。在Rails中,我可以这样做:config.time_zone='EasternTime(US&Canada)'config.active_record.default_timezone='EasternTime(US&Canada)'但如果我不使用rails,我该如何设置时区? 最佳答案 ActiveRecord::Base.default_timezone='EasternTime(US&Canada)' 关于ruby-没有轨道的A

  9. ruby-on-rails - 没有这样的文件或目录 - 用 Mini Magick 识别 - 2

    在我让另一个人重做我的前端UI之前,我的Rails应用程序运行平稳。我已经尝试解决此错误3天了。这是错误:Nosuchfileordirectory-identifyExtractedsource(aroundline#59):575859606162@post=Post.find(params[:id])authorize@postif@post.update_attributes(post_params)flash[:notice]="Postwasupdated."redirect_to[@topic,@post]else{"utf8"=>"✓","_method"=>"patc

  10. ruby-on-rails - 没有参数的 `<<`(小于两倍)是什么意思? - 2

    我在一个我想在formtasticGem中覆盖的方法中找到了这个。该方法如下所示:defto_htmlinput_wrappingdohidden_field_html是什么意思?在第三行做什么?我知道它对数组有什么作用,但在这里我不知道。 最佳答案 你可以这样读:hidden_field_htmllabel_with_nested_checkbox是连接到hidden_​​field_html末尾的参数-为了“清晰”,他们将其分成两行 关于ruby-on-rails-没有参数的`

随机推荐