我怎样才能包括第三列与MIN一个SELECT

问题描述 投票:0回答:3

在此查询,我也想选择一个第三列,wp_postmeta.post_id,在相同的查询。我无法弄清楚如何做到这一点,而不通过JOIN涉及subquerying其追加。是不是有一个更简单更简单的方法,无需使用子查询的? (愿意于子认输如果解决方案是有效的,不会占用过多资源密集型的。)

MariaDB的10.1

create table wp_posts (
  ID integer primary key auto_increment,
  post_title varchar(30),
  post_type varchar(30)
);
create table wp_postmeta (
  ID integer primary key auto_increment,
  post_id integer,
  meta_key varchar(30) not null default '_regular_price',
  meta_value integer not null
);
insert into wp_posts (post_title, post_type) values
('Apple Pie','Product'),
('French Toast','Product'),
('Shepards Pie','Product'),
('Jam Pie','Product'),
('Jam Pie','Product'),
('Plate','Not a Product'),
('Bucket','Not a Product'),
('Chequebook','Not a Product'),
('French Toast','Product'),
('French Toast','Product'),
('Banana','Product'),
('Banana','Product'),
('Banana','Product');
insert into wp_postmeta (post_id, meta_value) values
(1,10),
(2,5),
(3,9),
(4,8),
(5,11),
(6,12),
(7,10),
(8,6),
(9,1),
(10,1),
(11,7),
(12,2),
(13,2);
SELECT wp_posts.post_title, MIN(wp_postmeta.meta_value) FROM wp_postmeta JOIN wp_posts
ON wp_postmeta.post_id = wp_posts.id 
WHERE wp_posts.post_type = 'Product' AND wp_postmeta.meta_key = '_regular_price' 
GROUP BY wp_posts.post_title
ORDER BY wp_posts.post_title
post_title   | MIN(wp_postmeta.meta_value)
:----------- | --------------------------:
Apple Pie    |                          10
Banana       |                           2
French Toast |                           1
Jam Pie      |                           8
Shepards Pie |                           9

分贝<>小提琴here

编辑:我并不清楚,在我原来的问题不够明确, - 我要崩溃重复post_titles并使用对应wp_postmeta.post_idMIN(pm.meta_value)

sql syntax mariadb groupwise-maximum
3个回答
1
投票

如果我正确地跟着你,你的问题可以利用窗口函数来解决:

SELECT x.post_title, x.id
FROM (
    SELECT wp_posts.post_title, wp_postmeta.id, ROW_NUMBER() OVER (PARTITION BY wp_posts.post_title ORDER BY wp_postmeta.meta_value) rn
    FROM wp_postmeta 
    INNER JOIN wp_posts ON wp_postmeta.post_id = wp_posts.id 
    WHERE wp_posts.post_type = 'Product' AND wp_postmeta.meta_key = '_regular_price'
) x WHERE x.rn = 1;

See this DB Fiddle demo

窗函数去这样的用例(如果我的理解是正确的)的方式。他们通常在效率和可读性方面击败其他解决方案。


如果您的RDBMS不支持窗口功能,一个解决方案是用NOT EXISTS条件,确保有是对于给定的文章标题更小的meta值没有记录使用相关子查询。

SELECT p.post_title, MIN(m.id)
FROM 
    wp_postmeta m
    INNER JOIN wp_posts p 
        ON  p.id = m.post_id
        AND p.post_type = 'Product' 
WHERE 
    m.meta_key = '_regular_price'
    AND NOT EXISTS (
        SELECT 1
        FROM 
            wp_postmeta m1
            INNER JOIN wp_posts p1
                ON  p1.id = m1.post_id
                AND p1.post_type = 'Product'
        WHERE 
            m1.meta_key = '_regular_price'
            AND p1.post_title = p.post_title
            AND m1.meta_value < m.meta_value
     )
 GROUP BY p.post_title

DB Fiddle demo

注:我做了一个小的清洁您的SQL(添加表的别名运来一些条件,然后在相关的条款加入)。


1
投票

你就不能将其包含在GROUP BY

SELECT p.post_title, p.id, MIN(pm.meta_value)
FROM wp_postmeta pm JOIN
     wp_posts p
     ON pm.post_id = p.id 
WHERE p.post_type = 'Product' AND pm.meta_key = '_regular_price' 
GROUP BY p.post_title, p.id
ORDER BY p.post_title;

post_id是一样的p.id,所以你不妨利用这一点。

编辑:

如果标题可以重来,然后只需使用一个相关子查询:

SELECT p.post_title, p.id, pm.meta_value
FROM wp_postmeta pm JOIN
     wp_posts p
     ON pm.post_id = p.id 
WHERE p.post_type = 'Product' AND
      pm.meta_key = '_regular_price' AND
      pm.meta_value = (SELECT MIN(pm2.meta_value)
                       FROM wp_postmeta pm2 JOIN
                            wp_posts p2
                            ON pm2.post_id = p2.id 
                       WHERE p2.post_title = p.post_title
                      )
ORDER BY p.post_title;

1
投票

你可以用CTE托盘:

WITH T1
AS ( SELECT   post_title, MIN(id) AS ID
     FROM     wp_posts
     GROUP BY post_title )
SELECT   T1.ID, wp_posts.post_title, MIN(wp_postmeta.meta_value)
FROM     wp_postmeta
         JOIN wp_posts ON wp_postmeta.post_id = wp_posts.id
         JOIN T1 ON T1.post_title = wp_posts.post_title
WHERE    wp_posts.post_type = 'Product'
         AND wp_postmeta.meta_key = '_regular_price'
GROUP BY T1.ID,  wp_posts.post_title
ORDER BY wp_posts.post_title;

编辑:

你的表wp_posts应该是这样的

Id, post_title, post_type
1, 'Apple Pie','Product'
2, 'French Toast','Product'
3, 'Shepards Pie','Product'
4, 'Jam Pie','Product'
5, 'Plate','Not a Product'
6, 'Bucket','Not a Product'
7, 'Chequebook','Not a Product'
8, 'Banana','Product'

比你有这样的wp_postmeta表数据

post_id, meta_value
1,  10
2,  5
3,  9
4,  8
4,  11
5,  12 
6,  10
7,  6
2,  1
2,  1
8,  7
8,  2
8,  2

和查询这个样子

SELECT   wp_postmeta.post_id, wp_posts.post_title, MIN(wp_postmeta.meta_value)
FROM     wp_postmeta
         JOIN wp_posts ON wp_postmeta.post_id = wp_posts.id
WHERE    wp_posts.post_type = 'Product'
         AND wp_postmeta.meta_key = 'REG PRICE'
GROUP BY wp_postmeta.post_id,  wp_posts.post_title
ORDER BY wp_posts.post_title;
© www.soinside.com 2019 - 2024. All rights reserved.