gpt4 book ai didi

mysql - sql表设计以获取具有多个包含和排除条件的记录

转载 作者:行者123 更新时间:2023-11-29 19:21:34 29 4
gpt4 key购买 nike

我们希望根据以下参数选择客户,即客户应位于:

  1. 特定城市,即 cityId=1,2,3...

  2. 应排除特定的 customerId,即 customerId=33,2323,34534...

  3. 具体年龄,即5岁、7岁、72岁...

此包含和排除列表可以任意长。

我们应该如何为此设计数据库:

  1. 为这些包含城市创建单独的表“customerInclusionCities”,并执行以下操作:

从 cityId 位于的客户中选择 *(从 customerInclusionCities 中选择 cityId)

我们对年龄做了一些处理,创建表“customerEligibleAge”,其中包含符合条件的年龄条目的所有条目:

从年龄所在的客户中选择 *(从 customerEligibleAge 中选择年龄)

并创建单独的表“customerIdToBeExcluded”以排除客户:

从 customerId 不在的客户中选择 *(从 customerIdToBeExcluded 中选择 customerId)

或者

  • 创建一个包含类别和 ID 的表。即类别 1 表示城市,类别 2 表示要排除的 CustomerId。
  • 哪种方法更好,为这些参数创建一个表或为每个列表(即年龄、客户 ID、城市)创建单独的表?

    最佳答案

    IN ( SELECT ... ) 可能会非常慢。将查询作为单个 SELECT 进行,无需子查询。我假设所有 3 列都在同一个表中? (如果没有,就会增加复杂性。)WHERE 子句可能有 3 个 IN (constants) 子句:

    SELECT ...
    FROM tbl
    WHERE cityId IN (1,2,3...)
    AND customerId NOT IN (33,2323,34534...)
    AND age IN (5, 7, 72)

    拥有(至少):

    INDEX(cityId),
    INDEX(age)

    (否定的事物不太可能能够使用索引。)

    查询将使用其中一个索引;两者兼而有之,优化器就会选择它认为更好的一个。

    或者...

    SELECT c.*
    FROM customers AS c
    JOIN cityEligible AS b ON b.city = c.city
    JOIN customerEligibleAge AS ce ON c.age = ce.age
    LEFT JOIN customerIdToBeExcluded AS ex ON c.customerId = ex.customerId
    WHERE ex.customerId IS NULL

    建议的索引(可能为PRIMARY KEY):

    customers: (city)
    customerEligibleAge: (age)
    customerIdToBeExcluded: (customerId)

    为了进一步讨论,请为每个表提供SHOW CREATE TABLE,并为任何实际有效的查询提供EXPLAIN SELECT ...

    关于mysql - sql表设计以获取具有多个包含和排除条件的记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42408707/

    29 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com