¡Buenas tardes! Empecé a estudiar MySql y me enfrenté a un problema:

Error de consulta: Error: ER_WRONG_FIELD_WITH_GROUP: La expresión # 1 de la lista SELECT no está en la cláusula GROUP BY y contiene la columna no agregada 'test.product.name' que no depende funcionalmente de las columnas en la cláusula GROUP BY; esto es incompatible con sql_mode = only_full_group_by

Usé este sitio para estudiar https://www.db-fiddle.com/f/ xxV16kmnZKmPktUdMSK6xZ / 0

Mi tarea es hacer: encuentre una región con el precio más bajo para cada producto. Cuando hay varias regiones con el mismo precio, elija la primera en orden alfabético.

Mi mesa:

create table product(id int, name varchar(99));
create table region(id int, name varchar(99));
create table price(productId int, regionId int, price decimal(9, 2));

insert into product values(1, 'Crab');
insert into product values(2, 'Crayfish');

insert into region values(1, 'Kiev');
insert into region values(2, 'Kharkov');
insert into region values(3, 'Lvov');

insert into price values(1, 1, 100);
insert into price values(1, 2, 100);
insert into price values(1, 3, 200);
insert into price values(2, 1, 200);
insert into price values(2, 2, 100);
insert into price values(2, 3, 100); 

Mi selecto:

select product.name 'product', price.price, region.name 'Region name' 
from price
left join product on product.id = price.productId
left join region on region.id = price.regionId
where price.price != 0
group by region.name
having max(price.price)
order by region.name

Resultado esperado:

product region  price
Crab    Kharkov 100
Crayfish    Kharkov 100
1
kolya kolya 22 ene. 2018 a las 18:44

3 respuestas

La mejor respuesta

Yo usaría algo así:

select
  p2.name as product,
  (
    select min(r.name)
    from
      price as c2
      inner join region as r on c2.regionid = r.id
    where c2.productId = t.id and c2.price = t.price) as region,
  t.price
from
  product as p2
  inner join (
    select
      p.id,
      min(c.price) as price
    from
      product as p
      left outer join price as c on p.id = c.productId
    group by p.id) as t on p2.id = t.id

La idea principal es obtener precios mínimos para cada producto (subconsulta t) y luego encontrar una región mínima (es decir, primero alfabéticamente) para cada combinación de producto / precio

0
Iłya Bursov 22 ene. 2018 a las 16:07

Puede usar una combinación en el precio máximo agrupado por producto y región

select t.product, price.price, t.region
from price
INNER JOIN ( 
select price.productID, price.regionId, product.name product, 
          max(price.price) max_price, region.name Region 
from price
left join product on product.id = price.productId
left join region on region.id = price.regionId
where price.price != 0
group by product.name , 
    region.name,
    price.productID,
    price.regionId ) t on t.productId = price.productId  
      and t.regionId = price.regionId and t.max_price =  price.price
0
scaisEdge 22 ene. 2018 a las 16:07

Para obtener el precio más bajo para cada producto, puede hacer:

select p.*
from price p
where p.price = (select min(p2.price) from price p2 where p2.product_id = p.product_id);

join s adicionales traerán los nombres en lugar de los id s.

Para obtener una fila por producto:

select p.product_id, p.price, min(r.name)
from price p join
     region r
     on p.regionId = r.id
where p.price = (select min(p2.price) from price p2 where p2.product_id = p.product_id)
group by p.product_id, p.price;
0
Gordon Linoff 22 ene. 2018 a las 15:48
48385317