Наиболее эффективный способ выбрать соответствующее значение в другом столбце для MIN (столбец) - PullRequest
0 голосов
/ 04 февраля 2019

На основании этих данных:

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,2),
(12,1),
(13,7);

Этот SQL-запрос

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

даст

+--------------+-----------------------------+
|  post_title  | MIN(wp_postmeta.meta_value) |
+--------------+-----------------------------+
| Apple Pie    |                          10 |
| French Toast |                           1 |
| Shepards Pie |                           9 |
| Jam Pie      |                           8 |
| Banana       |                           1 |
+--------------+-----------------------------+

https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=fa38dd4e21395ad3855cf880a65afc2a

ОднакоЯ также хочу соответствующее значение в строках для другого столбца, wp_posts.post_id (уникальный).Как бы я включил это в SELECT эффективно?

Ответы [ 2 ]

0 голосов
/ 01 марта 2019

Вы можете использовать MAX(wp_posts.id):

SELECT MAX(wp_posts.id) AS 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 = '_regular_price' 
GROUP BY wp_posts.post_title
post_id | post_title   | MIN(wp_postmeta.meta_value)
------: | :----------- | --------------------------:
      1 | Apple Pie    |                          10
     10 | French Toast |                           1
      3 | Shepards Pie |                           9
      5 | Jam Pie      |                           8
     13 | Banana       |                           1
0 голосов
/ 04 февраля 2019

использовать оконную функцию row_number ()

select ID,post_title,post_type,meta_value from 
(SELECT wp_postmeta.ID,post_title,post_type ,meta_value,
row_number()over(partition by post_title order by wp_postmeta.meta_value) rn                           
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' 

) t where t.rn=1
...