Vyzmojen li e takyv SQL izraz
12 отговора
581 прегледа
Vyzmojen li e takyv SQL izraz
tozi vypros shte e dylgichuk, izvinqvam se za koeto, no iskam da obqsnq podrobno za kakvo stava duma.
Znachi predstavete si edna prosta tablica koqto ima 2 poleta. Ednoto ot tezi dve poleta e string koito shte se povtarq mnogo pyti. stava eto tova:
|---------|
|pole1 | pole2|
|---------|
|value1| val1 |
|value2| val1 |
|value3| val1 |
|---------|
Vmesto da zapisvam edni i syshti stoinosti mnogo pyti si syzdavam oshte edna tablica koqto da mi sydyrja samo tozi string i nqkakyv identifikator za nego. Poluchava se:
table1
|---------|
|pole1 | pole2|
|---------|
|value1| 1 |
|value2| 1 |
|value3| 1 |
|---------|
table2
|--------|
| id | value |
|--------|
| 1 | val1 |
|--------|
sled tova s edno sql izrazche kato:
select table1.pole1, table2.value as pole2 from table1, table2 where table2.id = table1.pole2;
si vzemam napravo stoinostite koito mi trqbvat, t.e.:
|----------|
|value1 | val1 |
|value2 | val1 |
|value3 | val1 |
|----------|
Za nqkoi koito se zanimava s bazi danni tova si e prosta rabota. Dotuk dobre. Ami ako imame slednoto polojenie:
table1
|---------|
|pole1 | pole2|
|---------|
|value1| 1,2,3|
|value2| 1,3 |
|value3| 1 |
|---------|
table2
|--------|
| id | value |
|--------|
| 1 | val1 |
| 2 | val2 |
| 3 | val3 |
|--------|
Moje bi se seshtate veche tochno za kakvo govorq. s sql izraz:
select table1.pole1, table2.value as pole2 from table1, table2 where table1.pole2 regexp table2.id;
rezultatyt koito mi se vryshta ima vida:
|----------|
|value1 | val1 |
|value1 | val2 |
|value1 | val3 |
|value2 | val1 |
|value2 | val3 |
|value3 | val3 |
|----------|
A na men tova ne mi vyrshi rabota.
vyprosyt mi e, ima li nqkakyv nachin i ako nqkoi moje da mi napishe primeren sql izraz s koito moje da stane taka che rezultatite da imat vida:
|------------------|
|value1 | val1, val2, val3 |
|value2 | val1, val3 |
|value3 | val3 |
|------------------|
Mnogo shte sum blagodaren na vseki koito moje da mi dade nqkakyv syvet, i se izvinqvam ako na nqkoi tova mu se e storilo prosto za tova dylgo opisanie.
Znachi predstavete si edna prosta tablica koqto ima 2 poleta. Ednoto ot tezi dve poleta e string koito shte se povtarq mnogo pyti. stava eto tova:
|---------|
|pole1 | pole2|
|---------|
|value1| val1 |
|value2| val1 |
|value3| val1 |
|---------|
Vmesto da zapisvam edni i syshti stoinosti mnogo pyti si syzdavam oshte edna tablica koqto da mi sydyrja samo tozi string i nqkakyv identifikator za nego. Poluchava se:
table1
|---------|
|pole1 | pole2|
|---------|
|value1| 1 |
|value2| 1 |
|value3| 1 |
|---------|
table2
|--------|
| id | value |
|--------|
| 1 | val1 |
|--------|
sled tova s edno sql izrazche kato:
select table1.pole1, table2.value as pole2 from table1, table2 where table2.id = table1.pole2;
si vzemam napravo stoinostite koito mi trqbvat, t.e.:
|----------|
|value1 | val1 |
|value2 | val1 |
|value3 | val1 |
|----------|
Za nqkoi koito se zanimava s bazi danni tova si e prosta rabota. Dotuk dobre. Ami ako imame slednoto polojenie:
table1
|---------|
|pole1 | pole2|
|---------|
|value1| 1,2,3|
|value2| 1,3 |
|value3| 1 |
|---------|
table2
|--------|
| id | value |
|--------|
| 1 | val1 |
| 2 | val2 |
| 3 | val3 |
|--------|
Moje bi se seshtate veche tochno za kakvo govorq. s sql izraz:
select table1.pole1, table2.value as pole2 from table1, table2 where table1.pole2 regexp table2.id;
rezultatyt koito mi se vryshta ima vida:
|----------|
|value1 | val1 |
|value1 | val2 |
|value1 | val3 |
|value2 | val1 |
|value2 | val3 |
|value3 | val3 |
|----------|
A na men tova ne mi vyrshi rabota.
vyprosyt mi e, ima li nqkakyv nachin i ako nqkoi moje da mi napishe primeren sql izraz s koito moje da stane taka che rezultatite da imat vida:
|------------------|
|value1 | val1, val2, val3 |
|value2 | val1, val3 |
|value3 | val3 |
|------------------|
Mnogo shte sum blagodaren na vseki koito moje da mi dade nqkakyv syvet, i se izvinqvam ako na nqkoi tova mu se e storilo prosto za tova dylgo opisanie.
Re: Vyzmojen li e takyv SQL izraz
Виж тук
__________________________________
Пътят към ада е осеян с добри намерения
__________________________________
Пътят към ада е осеян с добри намерения
Re: Vyzmojen li e takyv SQL izraz
Prochetoh tova koeto pisheshe tam, no ne mislq che to se otnasq kym moeto polojenie. Beginner iska samo da tyrsi izmejdu tezi 'x1,x5,x7,xn', a na men ne mi e problema v tova. priznavam che edva li e nai-dobroto reshenie tova koeto sym izbral, no...
Az iskam da izbegna povtarqneto na rezultatite za vsqka stoinost.
Az iskam da izbegna povtarqneto na rezultatite za vsqka stoinost.
Re: Vyzmojen li e takyv SQL izraz
Виждам, че имаш желание да четеш, но имам чувството, че знанията ти за БД за хаотични.
Не го приемай като упрек, никой не се е родил научен:) но е добре да прочетеш малко за НАЧАЛАТА
Ако ти е интересно вж. [линк]
Не го приемай като упрек, никой не се е родил научен:) но е добре да прочетеш малко за НАЧАЛАТА
Ако ти е интересно вж. [линк]
Re: Vyzmojen li e takyv SQL izraz
Здравей, според мен тук става въпрос за нормализиране на бази данни. Не можеш ей така да решиш да преместиш стойностите от една колона в отделна таблица макар че почти си уцелил едното правило. Базата ти трябва да е нормализирана, т.е. да са спазени поне първите 3 нормални форми(това са правилата за които говорих), а те общо са 5 + едно допълнение на 3-тата което се води отделно правило. Но като за начало са важни първите 3. Ето ти линк за да се запознаеш с тях:[линк]
Ти си се опитал да приложиш първата без да я знаеш, което не е малко. Изнесъл си повтарящата се информация в отделна таблица. Но не е правилно да я изнесеш по този начин, ти виждаш че нчкакъв стринг се повтаря и го слагаш в отделна таблица. Само че за един запис можеш да имаш няколко стринга които се повтарят и са отделени от запетаи. За да не обяснявам кое действие от кое правило е предизвикано(ти ще го видиш в статията) ще ти кажа как трябва да стане: Правиш си номенклатура със всички повтарящи се стрингове с 2 колони, sn_id, sn_name - където първата ти е уникален номер а втората името на стринга. И за да не останат в първтата ти таблица записи с номера, отделени от запетая, което е изключително неправилно, си правиш една нова таблица, която ще помни за дадено id от твоята първа таблица кои id-та от номенклатурата му отговарят. Ако приемем, че втората допълнителна таблица която ще направиш се казва mytable_link, а първата string_name, където началната ти таблица се казва mytable то тогава израза, който решава проблема ти е следния:
SELECT m.pole1,sn.name
FROM mytable m,mytable_link ml,string_name sn
WHERE ml.mytable_id=m.mytable_id
AND ml.sn_id=sn_id
Но така всеки стринг ще ти излезе на отделен ред а не всички стрингове отделени от запетаи за всеки запис от mytable както ти искаш.
Ако това не те устройва за display-а ти ще си направиш направиш функция, която за всеки един запис от mytable ще взима всички записи от mytable_link отговарящи на този от mytable и ще ги сложи в един масив например които ще ти го върне като стойност и ти съответно ще обходиш този масив и ще отпечатиш елементите му отделени от запетая и готово.
Сега в момента не мога да се сетя как само с SQL да се отпечатат на един ред и мисля, че не може без да претендирам че каквото мисля то е точно така.
Това е моят съвет!
Ти си се опитал да приложиш първата без да я знаеш, което не е малко. Изнесъл си повтарящата се информация в отделна таблица. Но не е правилно да я изнесеш по този начин, ти виждаш че нчкакъв стринг се повтаря и го слагаш в отделна таблица. Само че за един запис можеш да имаш няколко стринга които се повтарят и са отделени от запетаи. За да не обяснявам кое действие от кое правило е предизвикано(ти ще го видиш в статията) ще ти кажа как трябва да стане: Правиш си номенклатура със всички повтарящи се стрингове с 2 колони, sn_id, sn_name - където първата ти е уникален номер а втората името на стринга. И за да не останат в първтата ти таблица записи с номера, отделени от запетая, което е изключително неправилно, си правиш една нова таблица, която ще помни за дадено id от твоята първа таблица кои id-та от номенклатурата му отговарят. Ако приемем, че втората допълнителна таблица която ще направиш се казва mytable_link, а първата string_name, където началната ти таблица се казва mytable то тогава израза, който решава проблема ти е следния:
SELECT m.pole1,sn.name
FROM mytable m,mytable_link ml,string_name sn
WHERE ml.mytable_id=m.mytable_id
AND ml.sn_id=sn_id
Но така всеки стринг ще ти излезе на отделен ред а не всички стрингове отделени от запетаи за всеки запис от mytable както ти искаш.
Ако това не те устройва за display-а ти ще си направиш направиш функция, която за всеки един запис от mytable ще взима всички записи от mytable_link отговарящи на този от mytable и ще ги сложи в един масив например които ще ти го върне като стойност и ти съответно ще обходиш този масив и ще отпечатиш елементите му отделени от запетая и готово.
Сега в момента не мога да се сетя как само с SQL да се отпечатат на един ред и мисля, че не може без да претендирам че каквото мисля то е точно така.
Това е моят съвет!
Re: Vyzmojen li e takyv SQL izraz
"Базата ти трябва да е нормализирана, т.е. да са спазени поне първите 3 нормални форми"
Има доста случаи в които е по-добре да не е нормализирана, а по някога е невъзможно да е в която и да е нормална форма.
__________________________________
Пътят към ада е осеян с добри намерения
Има доста случаи в които е по-добре да не е нормализирана, а по някога е невъзможно да е в която и да е нормална форма.
__________________________________
Пътят към ада е осеян с добри намерения
Re: а не тука станахме на кълбо ;)
Адски ми е интересно как ще направиш SQL база данни която да не е дори Първа Нормална Форма
И ако успееш за какво точно ще ти послужи?
salle.online.bg/sig
И ако успееш за какво точно ще ти послужи?
salle.online.bg/sig
Re: а не тука станахме на кълбо ;)
Първа нормална форма изисква всяка клетка да има "атомарна" стойност, а като изцопам едно ENUM и данните стават ненормализирани.
В доста проекти съм използвал това. Трябва да си поиграя дали е по-бързо от JOIN на таблици, което е другия вариант. Ако пък е малка разликата във времето (в полза на JOIN-a), пак ще предпочета ENUM понеже конструкцията става "по-красива", а като напишеш една заявка един екран става доста трудно дебъгването (даже ти се приисква да прехвърлиш малко работа на сървърния скрипт
)
__________________________________
Пътят към ада е осеян с добри намерения
В доста проекти съм използвал това. Трябва да си поиграя дали е по-бързо от JOIN на таблици, което е другия вариант. Ако пък е малка разликата във времето (в полза на JOIN-a), пак ще предпочета ENUM понеже конструкцията става "по-красива", а като напишеш една заявка един екран става доста трудно дебъгването (даже ти се приисква да прехвърлиш малко работа на сървърния скрипт
__________________________________
Пътят към ада е осеян с добри намерения
Re: а не тука станахме на кълбо ;)
moje bi ima6 predvid SET. 6toto v ENUM nqma ni6to nenormal/*izira*/no ;))
Re: а не тука станахме на кълбо ;)
мдаааа... точно SET имах предвид.
Май отпуската ти се отразява добре
__________________________________
Пътят към ада е осеян с добри намерения
Май отпуската ти се отразява добре
__________________________________
Пътят към ада е осеян с добри намерения