Golden Basim Ответов: 1

Mysql : как выбрать вторую строку, если есть более одной записи, и выбрать первую, Если есть только одна запись?


привет,
у меня есть несколько предметов внутри st_items таблица и ее единицы измерения, хранящиеся в st_items_units как показано в этой таблице (показать единицы измерения пункта (1) и пункта (2):

stitemsu_ID -- stitems_ID -- stitemsu_UnitName -- stitemsu_UnitNum --
1 ------------ 1 ----------- Piece -------------- 1 -----------------
2 ------------ 1 ----------- Doz   -------------- 12 ----------------
3 ------------ 1 ----------- Box   -------------- 36 ----------------
4 ------------ 2 ----------- Piece -------------- 1 -----------------


в виде таблицы пункт 1 есть 3 единицы и пункт 2 повестки дня есть только один.
мне нужно творить Представление MySQL это показывает его наименьшие две единицы (1-я и 2-я), основанные на количестве частей в каждой из них (stitemsu_UnitName), так что результат будет таким :

stitems_ID -- SmallUnit -- LargeUnit -- stitemsu_UnitNum ---
1 ----------- Piece ------ Doz -------- 12 -----------------
2 ----------- Piece ------ Piece ------ 1  -----------------


Что я уже пробовал:

я попробовал этот код , и он успешно показал первую единицу (кусок), но мне не удалось показать вторую.


LEFT JOIN (SELECT
                             lunit.stitems_ID,
                             lunit.stitemsu_UnitName as LargeUnitID,
                             lunit.stitemsu_UnitNum
                                 FROM st_items_units lunit
                                 GROUP BY lunit.stitems_ID order by lunit.stitemsu_UnitNum desc limit 1,1) lunits
                      ON lunits.stitems_ID = items.stitems_ID



пожалуйста, проверьте полный код, который я написал.


CREATE OR REPLACE VIEW `view_items_stock_per_store_with_small_large_unit` as
							  SELECT items.stitems_ID,
							  items.stitems_Status,
							  items.stitems_Name,
							  items.stitems_Type,
							  items.stitems_Pharma_ActiveIngredient,
							  items.stitems_Code,
                              items.stcate_ID,
                              items.stitems_Manufacturer,
                              cat.stcate_Name,
							  manuf.manu_Name,
                              sunits.SmallUnitID,
                              sUName.Unit as SmallUnit,
							  lunits.LargeUnitID,
                              lUName.Unit as LargeUnit,
                              lunits.stitemsu_UnitNum,
                              (CASE 
									WHEN items.stitems_Type  = 0 THEN COALESCE(ca.Amount, 0)
									WHEN items.stitems_Type = 1 THEN COALESCE(pa.Amount,0)
								END) AS stock,
                                 (CASE 
									WHEN items.stitems_Type  = 0 THEN  ca.StoreID
									WHEN items.stitems_Type = 1 THEN  pa.ss_StoreID
								END) AS storeID,
                                stores.store_Name,
                                 (CASE 
									WHEN items.stitems_Type  = 0 THEN COALESCE(ca.TotalCost, 0)
									WHEN items.stitems_Type = 1 THEN COALESCE(pa.TotalCost,0)
								END) AS totalCost,
                              (CASE 
									WHEN items.stitems_Type  = 0 THEN COALESCE(ca.TotalCost, 0) / COALESCE(ca.Amount, 0)
									WHEN items.stitems_Type = 1 THEN COALESCE(pa.TotalCost,0) / COALESCE(pa.Amount,0)
								END) AS unitCost
					   FROM st_items items
                       LEFT JOIN (SELECT 
							  sunit.stitems_ID,
							  sunit.stitemsu_UnitName as SmallUnitID,
                              sunit.stitemsu_UnitNum
								  FROM st_items_units sunit
                                  where sunit.stitemsu_UnitNum =1
								  GROUP BY sunit.stitems_ID) sunits
					   ON sunits.stitems_ID = items.stitems_ID
                       LEFT JOIN (SELECT 
							  lunit.stitems_ID,
							  lunit.stitemsu_UnitName as LargeUnitID,
                              lunit.stitemsu_UnitNum
								  FROM st_items_units lunit
								  GROUP BY lunit.stitems_ID order by lunit.stitemsu_UnitNum desc limit 1,1) lunits
					   ON lunits.stitems_ID = items.stitems_ID


// ... the reset of the code

CHill60

Я предлагаю вам удалить весь код, который не имеет отношения к заявленной вами проблеме - никто не собирается читать все это

Golden Basim

я уже сделал это я пишу и то и другое

1 Ответов

Рейтинг:
2

CHill60

Первое, что вам нужно сделать, это сгруппировать данные на основе stitems_ID Вы можете присвоить каждому элементу в каждой "группе" номер строки на основе порядка сортировки - в данном случае на основе stitemsu_UnitNum по возрастанию (как вы хотите, чтобы два наименьших измерения в каждой группе).

Взгляните на результаты этого фрагмента кода

 select stitems_ID, stitemsu_UnitName, stitemsu_UnitNum,
    (@num:=if(@group = stitems_ID, @num +1, if(@group := stitems_ID, 1, 1))) row_number
from st_items t
CROSS JOIN (select @num:=0, @group:=null) c
order by stitems_ID, stitemsu_UnitNum asc , stitems_ID
Результаты
items_ID 
stitemsu_UnitName stitemsu_UnitNum row_number
1  Piece 1    1
1  Doz   12   2
1  Box   36   3
2  Piece 1    1
Теперь все, что вам нужно сделать, это иметь его в качестве подзапроса и извлекать только те элементы,которые меньше или равны 2, т. е.
select * FROM
(
   select stitems_ID, stitemsu_UnitName, stitemsu_UnitNum,
      (@num:=if(@group = stitems_ID, @num +1, if(@group := stitems_ID, 1, 1))) row_number 
  from st_items t
  CROSS JOIN (select @num:=0, @group:=null) c
  order by stitems_ID, stitemsu_UnitNum asc , stitems_ID
) as x 
where x.row_number <= 2;

Кредит: адаптировано из решения Тарин @ здесь[^]