标签: subquery

子查询 ORDER BY 不适用于 MySQL 5.6,但适用于 5.5

我尝试将 3 个表(产品、价格、类别)连接在一起,以从连接的表中获取最新和最低价格的结果。

我能够在 MySQL 5.5 上获得预期结果,但升级到 5.6 后,ORDER BY子查询似乎被忽略了。如何更改查询以使其工作ORDER BY

该查询应该是:

  1. 查找指定类别 ID 下的产品(例如:类别 ID 488)。
  2. 查找每种产品的最新价格。
  3. 将具有相同“匹配键”的产品分组(通过从产品名称中删除停用词生成的匹配键。由其他编程生成)
  4. 找到每个分组产品的最低价格
  5. 显示最低价格的每个分组产品信息

错误结果: 在此输入图像描述

3张表的关系如下:

  • 产品 <-> 多对多 <-> 类别
  • 产品 -> 一对多 -> 价格

表信息:

mysql> show columns from products;
+----------------+------------------+------+-----+---------------------+-----------------------------+
| Field          | Type             | Null | Key | Default             | Extra                       |
+----------------+------------------+------+-----+---------------------+-----------------------------+
| id             | int(10) unsigned | NO   | PRI | NULL                | auto_increment              |
| name           | varchar(300)     | NO …
Run Code Online (Sandbox Code Playgroud)

mysql performance order-by subquery mysql-5.6 query-performance

5
推荐指数
1
解决办法
2543
查看次数

JOIN 中的 MySQL LIMIT

我有一个 1:m 协会。

symbols表中有很多行company_key_statisticscompany_key_statistics有一个时间戳列createdAt,指示行的创建时间。我需要加入最新symbolscompany_key_statistics,但我只需要最新的company_key_statistics。例如,我需要获取ORCL并且MSFT symbols仅获取他们最新的company_key_statistics.

到目前为止我已经尝试过了。

SELECT `symbols`.`id`, 
       `symbols`.`symbol`, 
       `statistics`.
       `marketCapitalization` 
FROM   `symbols` 
       LEFT JOIN (SELECT `s`.`companyId`, 
                         `s`.`marketCapitalization` 
                  FROM   `company_key_statistics` AS `s`
                  WHERE  `s`.`companyId` = `symbols`.`id` 
                  ORDER by `createdAt` 
                  DESC LIMIT 1) AS `statistics` 
ON     `symbols`.`id` = `statistics`.`companyId` 
WHERE  `symbols`.`symbol` IN ('ORCL', 'SNAP');
Run Code Online (Sandbox Code Playgroud)

但不幸的是我发现我不能在子查询中使用父查询中的列JOIN

我怎样才能做到这一点?

mysql join subquery limits

5
推荐指数
1
解决办法
4万
查看次数

插入表,忽略具有默认值的列

我有一个 PostgreSQL 数据库,其中有很多相同结构的表,总共 36 列:

CREATE TABLE some_schema.some_table    (
    id integer NOT NULL DEFAULT nextval('some_schema.id_seq'::regclass),
    col2,
    col3,
    col4,
    [...],
    col35,
    mi_prinx integer NOT NULL DEFAULT nextval('some_schema.mi_prinx_seq'::regclass),
    CONSTRAINT some_table_pkey PRIMARY KEY (mi_prinx)
)
Run Code Online (Sandbox Code Playgroud)

在许多情况下,我必须从具有相同结构的另一个表中插入记录:

INSERT INTO some_schema.some_table (col2,col3...col35)
    SELECT col2,col3...col35
    FROM some_schema.another_table_with_same_structure;
Run Code Online (Sandbox Code Playgroud)

有没有一种方法可以做到这一点,而不必列出所有没有默认值的列?我想我可以以某种方式使用,但我无法根据文档DEFAULT VALUES获得正确的语法。

postgresql insert subquery default-value

5
推荐指数
1
解决办法
9855
查看次数

嵌套子查询中的用户父表 ID

SELECT users.*,(SELECT COUNT(user_id) AS mutual_connection FROM 
                (SELECT user_id 
                       FROM (
                                SELECT sender_id AS user_id 
                                FROM `connections`
                                WHERE receiver_id=users.id AND status='2' 
                                UNION 
                                SELECT receiver_id AS user_id 
                                FROM `connections` 
                                WHERE sender_id=users.id AND status='2'
                        ) tempUser
                        WHERE user_id IN (
                                  SELECT sender_id AS user_id
                                  FROM `connections` 
                                  WHERE receiver_id='4' AND status='2'
                                  UNION 
                                  SELECT receiver_id AS user_id 
                                  FROM `connections` WHERE sender_id='4' AND status='2') 
                         GROUP BY user_id) 
                as mutualConnection)

     FROM users
Run Code Online (Sandbox Code Playgroud)

错误:

#1054 - 'where 子句'中的未知列'users.id'

如何使用传递值进行子查询

mysql subquery

5
推荐指数
2
解决办法
2万
查看次数

作为 INSERT INTO ... RETURNING 的结果包括未插入的行

我正在使用 PostgreSQL 11。我想有条件地将值插入表中,同时插入的结果包括null未导致插入的输入的每一行。

例如

CREATE TABLE all_sums (sum INTEGER);
SELECT
    CASE WHEN a_sum IS NULL THEN null
         ELSE (SELECT sum FROM (INSERT INTO sums (sum) VALUES (sum) RETURNING sum))
    END
FROM
    (SELECT a + b FROM (VALUES (1, null), (null, 2), (2, 3)) AS row (a, b))
AS a_sum;
Run Code Online (Sandbox Code Playgroud)

应该导致表格all_sums看起来像:

all_sums: sum
         ------
           5
         (1 row)
Run Code Online (Sandbox Code Playgroud)

但查询的输出应该是:

 null
 null
 5
------
(3 rows)
Run Code Online (Sandbox Code Playgroud)

此示例因语法错误而失败:

ERROR:  syntax error at or near "INTO"
Run Code Online (Sandbox Code Playgroud)

有什么方法可以实现所需的查询输出?


(对于上下文:我这样做的原因是因为还有进一步的查询依赖于知道插入是否发生在特定行上。

这是通过将我的查询从每行一个转换为每列一个来更有效地从文件中插入一些数据的努力的一部分。不过,我不是在寻找其他提高插入速度的技巧,如果不可能,我很高兴在这一点上结束。)

postgresql insert subquery case postgresql-11

5
推荐指数
1
解决办法
356
查看次数

Postgres 是否使用子查询优化此 JOIN?

在 Postgres 12 中,我有一张桌子purchase_orders和一张桌子items。我正在运行一个查询,该查询返回给定的 POshop和每个 PO 上订购的项目的总和:

SELECT po.id, 
       SUM(grouped_items.total_quantity) AS total_quantity
FROM purchase_orders po
LEFT JOIN (
  SELECT purchase_order_id, 
  SUM(quantity) AS total_quantity
  FROM items
  GROUP BY purchase_order_id
) grouped_items ON po.id = grouped_items.purchase_order_id

WHERE po.shop_id = 195
GROUP BY po.id
Run Code Online (Sandbox Code Playgroud)

此查询返回所需的结果。JOIN 在一个子查询中,因为会有其他 JOINS 到其他表,所以这会生成一个已经分组的表来连接。

我用相关 SELECT子查询而不是 JOIN编写了另一个查询。运行这两种方法的执行时间几乎相同,因此很难看出哪个更快。我跑了,EXPLAIN ANALYZE但不能很好地解释它。

问题:在上面的例子中,Postgres 会处理items子查询的整个表,并且只有在与purchase_orders? 或者它是否足够聪明来过滤集合,如果items首先?

EXPLAIN报告提到了“Seq Scan on Items...”,它似乎包含 中的所有行items,然后随着它向上移动树而减少。但不确定这是否意味着它实际上 …

postgresql join subquery

5
推荐指数
2
解决办法
965
查看次数

如何将使用外部表别名的 Top 1 子查询转换为 Oracle?

我有以下 SQL Server 查询

select
    (select top 1 b2 from  BB b where b.b1 = a.a1 order by b2) calc,
    a1,
    a2
from AA a
where a2 = 2;
Run Code Online (Sandbox Code Playgroud)

我可以使用解析函数重写

select
    (select b2 from 
    (select 
        row_number() over (order by b2) lfd, 
     b2 from  BB b where b.b1 = a.a1
    ) as t where lfd = 1
    ) calc,
    a1,
    a2
from AA a
where a2 = 2;
Run Code Online (Sandbox Code Playgroud)

但是当我将其转换为 oracle 时

create table AA ( a1 NUMBER(10), a2 NUMBER(10) );
insert …
Run Code Online (Sandbox Code Playgroud)

oracle subquery

4
推荐指数
1
解决办法
2万
查看次数

如何选择/计算列中存在相同值但不在同一表中的其他列中的行

我有这个表结构和数据:

CREATE TABLE IF NOT EXISTS `default_relations_users` (
  `id_user_rq` int(11) NOT NULL,
  `id_user_ap` int(11) NOT NULL,
  UNIQUE KEY `rusers_rq_ap_idx` (`id_user_rq`,`id_user_ap`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

INSERT INTO `default_relations_users` (`id_user_rq`, `id_user_ap`) VALUES
(1, 2),
(1, 3),
(1, 4),
(2, 1),
(2, 2),
(2, 3);
Run Code Online (Sandbox Code Playgroud)

我只需要获取值在左侧但不在右侧的行,例如:将不会选择 1,2 和 2,1 但 1,3 和 1,4 是。我试试这个查询:

SELECT * FROM default_relations_users
WHERE default_relations_users.id_user_rq = 1 
 AND NOT EXISTS (SELECT id_user_ap FROM default_relations_users WHERE id_user_ap = 1) 
Run Code Online (Sandbox Code Playgroud)

也许我不明白子查询是什么意思,或者我以错误的方式使用。所以有什么帮助吗?

mysql query subquery

4
推荐指数
1
解决办法
5万
查看次数

两个几乎相同的实例中的相同查询如何生成两个不同的执行计划?

服务器 A 和服务器 B 具有相同的硬件和实例配置(A 是生产,B 是 QA)。B 的数据库是从一周前 A 的备份中恢复的。开发团队向我提供了这个查询。

SELECT 
        c.Start
        ,c.[End]
        ,c.Word
        ,doc.UniqueDocumentNumber
        ,doc.EID
        ,c.CUI
        ,c.Concept
        ,a.OID
        ,doc.DocumentTypeName
        ,doc.ActivityDtTm
        ,CAST(doc.DocumentTypeId AS INT) AS MedCode
        ,CASE WHEN c.[Count] = 0 THEN  CAST(0.00 AS REAL)
           ELSE CAST(LOG(c.TotalCount / c.[Count]) AS REAL) END AS 'idf'
        ,c.[Count]
        ,c.TotalCount
FROM ECHO..AEID201 a
INNER JOIN ALPHA..XADocuments doc (NOLOCK) ON a.EID = doc.EID
CROSS APPLY (SELECT t.start,t.[end],t.word,t.cui,t.eid,
   t.UniqueDocumentNumber,cu.[Count],cc.TotalCount,core.Concept 
FROM HOTEL.dbo.Htf_Index AS t
INNER JOIN HOTEL..Doc_CUI_Counter AS cu ON cu.CUI=t.CUI AND cu.DocumentTypeID=t.DocumentTypeID
INNER JOIN HOTEL..Doc_Counter …
Run Code Online (Sandbox Code Playgroud)

execution-plan sql-server-2008-r2 subquery functions cross-apply

4
推荐指数
1
解决办法
577
查看次数

为什么我需要使用子查询来过滤分组选择?

如果我这样做——

SELECT dv.Name
      ,MAX(hb.[DateEntered]) as DE
FROM 
    [Devices] as dv
    INNER JOIN 
    [Heartbeats] as hb ON hb.DeviceID = dv.ID
WHERE DE < '2013-03-04'
GROUP BY dv.Name
Run Code Online (Sandbox Code Playgroud)

我收到这个错误——

消息 207,级别 16,状态 1,第 17 行 列名“DE”无效。

如果我这样做——

SELECT Name, DE FROM (
    SELECT dv.Name
          ,MAX(hb.[DateEntered]) as DE
    FROM 
        [Devices] as dv
        INNER JOIN 
        [Heartbeats] as hb ON hb.DeviceID = dv.ID
    GROUP BY dv.Name
) as tmp WHERE tmp.DE < '2013-03-04'
Run Code Online (Sandbox Code Playgroud)

它按预期工作。

有人可以解释为什么我需要将主查询嵌套为子查询来限制我的数据集吗?

另外,这里是否有更好的方法来实现目标?从一张表中检索所有记录,以及按[DateEntered]降序排列的单个“顶部”相关记录?

sql-server-2008 sql-server t-sql subquery

4
推荐指数
1
解决办法
4118
查看次数