mariadb 使用mysql根据第一个过滤结果添加更多的表行

cmssoen2  于 2022-11-08  发布在  Mysql
关注(0)|答案(1)|浏览(175)

使用mariadb版本10.5.15(以及带有python 3.9的SQLAlchemy)。在使用count == 3过滤以下表后,我将获得ID为
第2、3、4、7和12段。
如果第2、3、4、7或12行具有相同的group_id(不包括空值),但具有不同的group_leader值,则对于这些行中的每一行,我希望添加(同一表的)每一行。
(same group_id,不是相同的group_leader)1,3(来自id 2)5(来自id 4)10(来自id 7且仅来自id 10,因为group_leader必须不同)
| 标识符|计数器|组标识|组长|
| - -|- -|- -|- -|
| 一个|七个|一个|零值|
| 2个|三个|一个|一个|
| 三个|2个|一个|零值|
| 四个|三个|2个|一个|
| 五个|六个|2个|零值|
| 六个|2个|三个|零值|
| 七个|三个|三个|零值|
| 八个|一个|三个|零值|
| 九个|2个|三个|零值|
| 10个|五个|三个|一个|
| 十一|五个|零值|零值|
| 十二个|三个|零值|零值|
有没有可能先从..................................................................................................................................................................................................
这是一个实际的例子:

def query_positions(position_filter: dict):
    result = db.session.query(Positions).join(
    ProjectCrafts, Positions.project_craft_id == ProjectCrafts.project_craft_id).join(
        Projects, Positions.project_id == Projects.project_id
    )
    if "firm_id" in position_filter:
        result = result.filter(Positions.firm_id == position_filter["firm_id"])
    if "craft" in position_filter:
        result = result.filter(ProjectCrafts.craft == position_filter["craft"])
    if "craft_name" in position_filter:
        result = result.filter(ProjectCrafts.craft_name == position_filter["craft_name"])

    positions1 = aliased(Positions)
    result = result.join(positions1, Positions.is_parent == 1, Positions.family_id == positions1.family_id).join(
        Positions.family_id == positions1.family_id)
positions = result.all()
return positions

这个问题出现在positions1 = aliased(Positions)之后,我得到了这个错误
...
在连接确定中,隐式左侧引发sa_exc.无效请求错误(sqlalchemy.exc.无效请求错误:不知道如何在0x 7 fabd 1ad 30加入〈别名检查; Positions(Positions)〉。请使用.select_from()方法来建立显式左侧,并提供显式ON子句(如果尚未提供)以帮助解决歧义。

fkvaft9z

fkvaft9z1#

您可以将count_上的筛选数据表与原始数据表链接,并在原始数据表中加入两个主要条件:

  • “* 组标识 *”相同
  • group_leader”不同

然后在两个结果集之间应用UNION,可以选择在后面跟一个ORDER BY子句,以便对id上的值进行排序。
假设NULL值和NON-NULL值既不相等也不不同,比较它们的一种方法是使用COALESCE函数将NULL值转换为-1(假设“group_leader”值不能使用此值)。

WITH cte AS (
    SELECT * FROM tab WHERE count_ = 3
)
SELECT tab.* 
FROM       tab
INNER JOIN cte
        ON tab.group_id = cte.group_id
       AND COALESCE(tab.group_leader, -1) <> COALESCE(cte.group_leader, -1)
UNION 
SELECT * FROM cte
ORDER BY id

检查演示here

相关问题