Mysql заявка

stuklen

Registered
Здравейте,
Опитвам се да измисля една заявка, но нещо не мога да я измисля.
Става въпрос за взимане на един или друг ред в зависимост от съвпадение по ид.
Ще се опитам да го обясня чрез пример. Има една таблица с две колони група и стойност.

group_idvalue
15
07

Ако съвпада group_id с посоченото в where да връща първия ред, ако не съвпада втория.
Да приемем, че има таблица с продукти и това е таблица с цени за различни групи, като се приеме, че group_id = 0 е подразбиращата се група.

Ако потребителя е от група 1 би трявало да се върне value = 5, а ако е друга различна от 1 или 0 value = 7
Тази заявка може да е субкуери, функция вю или процедура и ще е като част от друга заявка.

Надявам се съм успял да обясня.
 
SQL:
SELECT 
  CASE 
    WHEN group_id = 1 THEN value 
    ELSE (SELECT value FROM table_name WHERE group_id = 0) 
  END AS selected_value 
FROM 
  table_name 
WHERE 
  group_id = {user_group_id}
 
Мисля, че това няма да свърши работа, защото {user_group_id} ако липсва няма да върне нищо, а трябва да върне подразбирщото се (group_id = 0), Също ще се вадят и още няколко колони, което не споменах и прави CASE неизползваемо.
 
Може далеч по-просто.

Със следната заявка ще извадиш или 1 ред с нулевата група (в случай че търсената я няма), или два реда - един ред с търсената и един ред с нулевата група:
SQL:
select * from table
where group_id = 0 OR group_id = INPUT_HERE

След това можеш просто да вземеш реда с по-голямата група, като сортираш по group_id (order) и вземеш по-голямото (limit):
SQL:
select * from table
where group_id = 0 OR group_id = INPUT_HERE
order by group_id desc
limit 1
 
Да, това е по-прост вариант, но тук трябва да върне само един ред. Защото тази заявка е суб в друга.
 
Да, това е по-прост вариант, но тук трябва да върне само един ред. Защото тази заявка е суб в друга.
Само един ред връща - затова е limit 1 накрая.
 
Тази заявка е част от друга във формата на суб заявка и трябва да върне няколко резултата за различни артикули.
Виж първия пост.
Мисля, че намерих решение само ще го дообмисля.
 
Мисля, че това няма да свърши работа, защото {user_group_id} ако липсва няма да върне нищо, а трябва да върне подразбирщото се (group_id = 0), Също ще се вадят и още няколко колони, което не споменах и прави CASE неизползваемо.

Да , но в описанието, което си написал казваш:
Ако съвпада group_id с посоченото в where

Да би било интересно да споделиш решението, за да мога да разбера по-точно какво си имал предвид :cool:
Мисля, че намерих решение само ще го дообмисля.
 
Да, но изречението продължава с ", ако не съвпада втория."
Нещо такова измислих, ще трябва да го тествам в различни варианти, че това е малка част от основната завката.
SQL:
select
    product_id, Price, Rate, EndDate
from
    table as sd
where
    (group_id = '{user_group_id}') or ( (group_id = 0) AND NOT EXISTS( SELECT * FROM table as sd1 WHERE (group_id = '{user_group_id}') and (sd.product_id = sd1.product_id) )
 
Да, но изречението продължава с ", ако не съвпада втория."
Еми да, ако не съвпада, ще ти покаже втория. Никъде не описа, че потребителя може да няма група.
 

Back
Горе