当前位置: 首页 > 面试题库 >

SQL:查找行并根据匹配列的数量排序?

谭敏学
2023-03-14
问题内容

假设我们有一个具有如此简单结构的“汽车”表…

car_id INT
color ENUM('black','white','blue')
weight ENUM('light','medium','heavy')
type ENUM('van','sedan','limo')

拳头,我选择的是汽车(1,黑色,重型,豪华轿车),然后我想获取相关汽车的列表,这些列表按匹配列的数量排序(没有任何列的权重)。所以,首先我期望看到(黑色,重型,豪华轿车)汽车,然后我期望看到只有2个匹配字段的汽车,等等。

是否可以使用SQL执行这种排序?

对不起,我的英语,但我真的希望我对您的问题很清楚。

谢谢你。


问题答案:

可能有几种方法可以优化子查询,但是不使用case语句或次优联接子句:

select
        *
    from
        (
            select
                    selection.CarId,
                    selection.Colour,
                    selection.Weight,
                    selection.Type,
                    3 as Relevance
                from
                    tblCars as selection
                where
                    selection.Colour = 'black' and selection.Weight = 'light' and selection.Type = 'van'
            union all
            select
                    cars.CarId,
                    cars.Colour,
                    cars.Weight,
                    cars.Type,
                    count(*) as Relevance
                from
                    tblCars as cars
                inner join
                    (
                        select
                                byColour.CarId
                            from
                                tblCars as cars
                            inner join
                                tblCars as byColour
                            on
                                cars.Colour = byColour.Colour
                            where
                                cars.Colour = 'black' and cars.Weight = 'light' and cars.Type = 'van'
                                and
                                byColour.CarId <> cars.CarId
                        union all
                        select
                                byWeight.CarId
                            from
                                tblCars as cars
                            inner join
                                tblCars as byWeight
                            on
                                cars.Weight = byWeight.Weight
                            where
                                cars.Colour = 'black' and cars.Weight = 'light' and cars.Type = 'van'
                                and
                                byWeight.CarId <> cars.CarId
                        union all
                        select
                                byType.CarId
                            from
                                tblCars as cars
                            inner join
                                tblCars as byType
                            on
                                cars.Type = byType.Type
                            where
                                cars.Colour = 'black' and cars.Weight = 'light' and cars.Type = 'van'
                                and
                                byType.CarId <> cars.CarId
                    ) as matches
                on
                    cars.CarId = matches.CarId
                group by
                    cars.CarId,
                    cars.Colour,
                    cars.Weight,
                    cars.Type
        ) as results
    order by
        Relevance desc

输出:

CarId   Colour  Weight  Type    Relevance
1       black   light   van     3
3       white   light   van     2
4       blue    light   van     2
5       black   medium  van     2
6       white   medium  van     1
7       blue    medium  van     1
8       black   heavy   limo    1


 类似资料:
  • 问题内容: 我有这个查询: 是否可以根据首先匹配的条件对从该查询返回的记录进行排序。我想先获取所有匹配的记录,然后再获取其他匹配的记录。 例如,如果我有以下记录: 我希望对它们进行如下排序: 有可能吗? 问题答案:

  • 我有一个包含100,000行(人)和500列(概率)的数据集,我想用测试概率扫描各列,以找到大于和最接近测试值的列标题(a、b或c ),并将标题记录在新列中。 以数据表为例: 新列将记录“a”(0.1 我最初做它作为一个矩阵,而不是data.table.下面的代码不会工作,但给出了一个想法,它是如何运作的 如何跨 data.table 中的列执行此匹配。我认为我需要使用 来自 的查询。但不确定如何

  • 问题内容: 我正在尝试使用with子句,并且希望能够以与清单中的元素相同的顺序返回结果。例如: 我希望他们以相同的顺序回来。理想的情况是,如果我能有一个这样的声明,那就太好了: 我已经看到了使用或关键字定义某种自定义排序的查询示例。但是,在所有这些示例中,它们的顺序都是针对一组预定的选项。鉴于我的订购完全取决于用户输入的搜索条件,因此可能有2个选项的列表或100个要订购的列表… 有任何想法吗?我不

  • 我要提前道歉——我知道这个问题可能已经在其他地方得到了解答,但是我似乎无法找到我需要的答案,也无法设法让我找到的其他代码适应我的需要。 我有一个数据框: 我想生成一个一个和两个之间COUNT值之差的数据帧,每个FILE都有一行,即。 我确信我应该能够相当容易地使用基础R或Plyr做到这一点,但我有点卡住了。任何人都可以建议一个好方法来做到这一点,也许在Plyr上有很好的教程,可能会帮助我解决将来的

  • 本文向大家介绍查找图的匹配数,包括了查找图的匹配数的使用技巧和注意事项,需要的朋友参考一下 问题陈述 下图的匹配数字是多少? 解 顶点数= 9 我们只能匹配8个顶点。 匹配号码为4。

  • 您能建议如何在Spring Data JPA存储库中编写查询吗?情况是这样的:我有两个实体:客户和产品,关系为“OneToMany”——意味着一个客户可能有多个产品。在代码中,看起来客户实体已经设置了产品,产品引用了客户,非常简单。如果我从DB JSON中检索Customer,将如下所示: 问题是,我如何向DB写入查询,以查找其产品与通过产品集合的产品匹配的所有客户?例如,我想找到所有拥有type