Autor Zpráva
Prkny
Profil
Dobrý den,

prosím o radu či nápad. Mám tabulku volby, zjednodušeně vypadá takto: id, kod, volba
např.
1,'df34', 'L'
2,'df34', 'S'
3,'df34', 'XL'
4,'df34', 'M'
5, 'sm45', '40'
6, 'sm45', '41'
7, 'sm45', '37'
8, 'am78', 'modrá'
9, 'am78', 'červená'
....

Jedná se o načtení dat do SELECTu. U většiny voleb mi stačí příkaz: SELECT * FROM `volby` WHERE kod='sm45' ORDER by volba, kdy je seřazení 37,40,41.
Rád bych ale vyřešil i konfekční velikosti, protože výše uvedený dotaz u kódu df34 se seřadí: L, M, S, XL, místo logičtějšího S, M, L, XL.

Napadla mě nějaká externí tabulka do které bych zadal prioritu pro XS,S,M,L,XL,XXL. Ale vůbec nevím zda je to vůbec reálné, jak to propojit a zda to jde udělat tak, aby to neovlivňovalo jiné volby.
Děkuji za radu.
Kajman
Profil
Do tabulky si přidejte nepovinný parametr poradi a řaďte nejprve podle něj a až potom podle volba.
RastyAmateur
Profil
Já osobně bych asi použil FIELD() nebo nějakou podobnou variantu. Pokud bude produkty zadávat uživatel, asi bych ho nechtěl nutit zadávat i nějaké pořadí. Problém je, že až kromě velikosti a barev přidáš i něco jiného, budeš muset upravit ten dotaz. Pokud produkty budeš přidávat ty, klidně bych použil Kajmanovo řešení.
Prkny
Profil
Přidat nepovinný parametr pořadí by bylo poměrně komplikované, ty volby se mi natahují automaticky cca z 15 importů XML z externích zdrojů.

RastyAmateur díky, to bude nejspíše ono:
SELECT * FROM `volby` WHERE kod='df34' ORDER by FIND_IN_SET (volba, 'S,M,L,XL'),volba
N71
Profil *
Prkny:
Měj na paměti, že na seřazení podle výsledku výpočtu nepoužije databáze žádný index. Na větší dataset to není vhodný způsob.
Kajman
Profil
Prkny:
Přidat nepovinný parametr pořadí by bylo poměrně komplikované, ty volby se mi natahují automaticky cca z 15 importů XML z externích zdrojů.

A v těch XML je definice těch číselníků ve správném pořadí? Pak by se mohlo i to pořadí do nepovinného sloupečku přidávat automaticky. Ale pokud si to chcete určovat ručně, můžete použít tu tabulku navíc.
Prkny
Profil
N71:
Ty volby se filtrují hlavně podle kódu, zbývá seřadit cca. do max 10 položek, takže to by asi problém být nemusel.

Kajman:
U jednoho je definice ve správném pořadí u druhého není... je to bohužel půl na půl.. :(
Kajman
Profil
Tak si můžete v konfiguraci importů nastavit, kde se u číselníků má zaznamenat pořadí z xml a kde ne. Tam kde se nezaznamená, si ho můžete určit ručně v té externí tabulce. Případně to řadit podle hodnoty, pokud nebude pořadí ani v externí tabulce ani v číselníku.

Stejně přeci musíte mít někde uložen ten string 'S,M,L,XL' a nezapomenout ho upravit, když přibude XS, XXL, XXXL nebo 4XL.

SELECT v.*
FROM   `volby` v
       LEFT JOIN `volby_rucni_poradi` rp
              ON v.kod = rp.kod
                 AND v.volba = rp.volba
WHERE  v.kod = 'df34'
ORDER  BY rp.poradi,
          v.poradi,
          v.volba 
Prkny
Profil
Kajman:
Zde se ale bohužel předpokládá, že ke každé položce se vytvoří pořadí (v.kod = rp.kod). To je věc, které jsem se chtěl původně zcela vyhnout.
Pokud by se to pořadí ke každé položce dělalo ručně, byla by pro nás praktičtější ta první varianta, o které jsme věděli a kterou jste navrhoval (Do tabulky si přidejte nepovinný parametr poradi a řaďte nejprve podle něj a až potom podle volba.), protože se z těch 15 XML nezpracovávají úplně všechna data ...

Aktuálně máme nasazeno třídění podle FIND_IN_SET i když je to taková nouzovka pro 40% podíl položek (lepší než drátem do oka).
Chtěl jsem to tady zkusit, zda někoho něco nenapadne v podobně nějakých šablon s PHP polem, nebo tak něco ...
Obávám se, že pokud to budeme chtít vyřešit na 100%, nepovinnému sloupci poradi a ručnímu nastavení u každé položky zvlášť se nevyhneme....
Děkuji za snahu.
Kajman
Profil
Prkny:
že ke každé položce se vytvoří pořadí

Ne, stačí to vytvořit jen pro položky, které je potřeba ručně přeskládat, protože pořadí v xml souboru je jinak, než žádáte.
Prkny
Profil
Kajman:
Rozumím. Ještě jednou díky.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0