Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: struktura bazy, sposob zapisu
Forum PHP.pl > Forum > Bazy danych > MySQL
AxZx
witam

mam przechowywac towary i uslugi w bazie
towar/usluga moze byc oferta lub potrzeba

tabele ulozylem tak (skrot)
Kod
id
nazwa
rodzaj (0 - oferta, 1 - potrzeba)


towar/usluga moze byc zarowno potrzeba jak i oferta, wiec jezeli jest tym i tym to beda 2 wiersze w bazie - tu juz mam watpliwosc czy jest to dobre rozwiazanie.

gdy zmieniam rodzaj towaru z oferty na potrzebe to usuwam poprzednie wpisy tego towaru i dodaje go na nowo ze zmienionym rodzajem - tu kolejna watpliwosc.

wymyslilem teraz ze moze zmienic tabele na:
Kod
id
nazwa
oferta ( 0 - nie oferta, 1 - oferta)
potrzeba ( 0 - nie potrzeba, 1 - potrzeba)

czyli jezeli towar jest oferta i potrzeba to ma dwie jedynki.

tylko ze powstaje pytanie jak wyswietlic towar jezeli jest oferta i potrzeba w dwoch wierszach?
np
naprawa komputerów - oferta
naprawa komputerów - potrzeba

czy mysql cos takiegio potrafi?
i prosze o ogolna wypowiedz na temat obu rozwiazan, ktore lepsze?
wijet
Drugi sposób wydaje mi się lepszy ale w przypadku(mniej rekordow). A wyswietlanie w sposob
Cytat
tylko ze powstaje pytanie jak wyswietlic towar jezeli jest oferta i potrzeba w dwoch wierszach?
np
naprawa komputerów - oferta
naprawa komputerów - potrzeba


robisz przez dwa zapytania poloczone UNION w jednym wybierasz te z "oferta" w drugim rekordy z "potrzeba" i wszystko sortujesz np. nazwie.
AxZx
a moze taka tabela:

id
nazwa
rodzaj

rodzaj moze byc
1 - oferta
2 - potrzeba
3 - oferta i potrzeba

juz baza bylaby mniej nadmiarowa.
tylko teraz tez nie wiem jak wyswietlic 2 wiersze jezeli rodzaj == 3
wijet
Wyswietlasz tak jak pisalem wcześniej
  1. (SELECT * FROM tabelka WHERE rodzaj = 1 OR rodzaj = 2) UNION (SELECT * FROM tabelka WHERE rodzaj = 3)
  2. ORDER BY tabelka.nazwa;


EDIT
@nospor
Tak faktycznie, zle napisalem.
nospor
@wijet akurat Twoj sposob, gdy rodzaj = 3, wyswietli ten rekord tylko raz. przeanalizuj se to jeszcze raz winksmiley.jpg

Przy tych wartosciach wyszla ladnie suma bitowa, mozna wiec tak:
  1. (SELECT * FROM tabelka WHERE rodzaj & 1) UNION (SELECT * FROM tabelka WHERE rodzaj & 2)


lub w php to przerobic, ze jesli rodzaj =3, to dany rekord wyswietlic dwukrotnie.
AxZx
ani jedno ani drugie rozwiazanie nie zadzialalo
w php nie chce tego obrabiac, wole na poziomie bazy.

wyswietla tak samo jak jeden select, nie robi z jednego dwoch wierszy.
sf
towary
id
nazwa

statusy_towarow
id
status

towary_posiadaja_statusy
id_towaru
id_statusu
AxZx
tak, to by bylo chyba najdoskonalsze rozwiazanie jesli chodzi o mysql. w php to troche wiecej roboty:)

dzieki
przemysle to
nospor
@AxZx moj przyklad nie zadzialal, gdyz union domyslnie ma ustawione usuwanie duplikatow. wystarczy tylko dopisac ALL i bedzie git:
  1. (SELECT * FROM tabelka WHERE rodzaj & 1) UNION ALL (SELECT * FROM tabelka WHERE rodzaj & 2)

smile.gif
AxZx
o widzisz, czlowiek uczy sie cale zycie:) dzieki

a dalsza czesc mojego problemu?
zamiana tor_rodzaj z 3 na 1 a w drugim wierszu na 2
to tez jest takie proste?smile.gif
czy moze lepiej odrazu zaczac zmieniac baze tak jak napisal sf
nospor
Cytat
dalsza czesc mojego problemu?
zamiana tor_rodzaj z 3 na 1 a w drugim wierszu na 2
to tez jest takie proste?
ALe wczesniej sie oto nie pytales.
Wczesniej sie pytales, jak zmienic z jednego rodzaju na drugi w ramach jednego rekordu, a tu nagle schizofremii dostales i jeden rekord chcesz na dwa rozbijac w sensie zmian statusow. W tym ostatnim pomysle to nawet struktura sf ci nie pomoze, gdyz jego struktura tez sie odnosi do jednego rekordu.

Jesli jednak chcesz miec dwa rekordy, to zrob dwa rekordy i nie kombinuj. Na chwile obecna nie jestem w stanie ci inaczej pomoc, bo nie wiem juz oco ci chodzi. a ty wiesz? smile.gif

ps: albo to ja jestem juz spiacy i nie widze prostoty twego problemu.... tak czy siak rozwin swoją mysl, proszę.
AxZx
wcale nie mowie ze moj pomysl jest prosty smile.gif
wlasciwie to bede musial sie zastanowic czy takie cos wogole jest mi potrzebne
bo moge poprostu wyswietlic ten jeden rekord i napisac obok oferta/potrzeba

chce z jednego wiersza zrobic dwa:)
zamiast
1 nazwa_towaru 3 (gdzie 3 to rodzaj)
zeby wypisal
1 nazwa_towaru 1
1 nazwa_towaru 2
ot tyle:)
z rozwiazaniem sf byloby chyba latwiej kombinowac.
ale jezeli mysql ma taka mozliwosc to chcialbym z niej skorzystac.
nospor
o, teraz gadasz po ludzku winksmiley.jpg

  1. (SELECT nazwa_towaru, IF(rodzaj=3,1,rodzaj) FROM tabelka WHERE rodzaj & 1)
  2. UNION ALL
  3. (SELECT nazwa_towaru, IF(rodzaj=3,2,rodzaj) FROM tabelka WHERE rodzaj & 2)

smile.gif

ps: a teraz ide spac, dobranoc 4 all smile.gif
AxZx
no no smile.gif
wyniki dobre

dzieki bardzo

hmm tylko jak policzyc ile tych wynikow jest?
count(*)?
nospor
chcesz i wyswietlac i znac ich ilosc?
http://pl.php.net/manual/pl/function.mysql-num-rows.php

co do count(*) to zaprzeproszeniem zamiast sie "glupio" pytac to bys sprobowal to wstawic i sprawdzil.... tongue.gif
ja sprawdzielm i dziala winksmiley.jpg
sf
Osobiście staram się unikać uni bo to takie hm rozwiązanie naookoło mi się wydaje - stosuje tylko gdy poprostu mam już gotową strukturę bazy danych i nie mogę jej zmienić.
nospor
@sf ja tam rownież w praktyce nigdy nie korzystalem z union.
Jakos mi to nigdy nie bylo potrzebne, a i tutaj tez nie jest, ale jak sie AxZx uwzial, to niech ma winksmiley.jpg
AxZx
no wcale sie nie uwzialem, tylko pytam jak by to mozna bylo zrobic.
jezeli znasz jeszcze inne rozwiazanie to chetnie sie zapoznam:)

a co do count to nie wiem jak sprawdzic, dac count to kazdego zapytania?
nospor
Cytat
jezeli znasz jeszcze inne rozwiazanie to chetnie sie zapoznam
Juz ci mowilem, ja bym ten rekord rozmnozyl w php smile.gif

Cytat
a co do count to nie wiem jak sprawdzic, dac count to kazdego zapytania?
A tu sie klania tez to co mowilem wczesniej: sprawdz, anie sie pytasz, az tak duzo kombinacji nie masz tongue.gif
tak, do kazdego zapytania smile.gif
AxZx
okej, postanowilem i zabralem sie za zmiany.
zmienilem juz czesc aplikacji, wg schematu sf - czyli tak jak ma byc normalnie:)
tylko ze mam problem, ktory zreszta kiedys juz sie pojawil tylko omijalem go w brzydki sposob (nawet nie pamietam juz jak).

przykladowa sytuacja:
uzytkownik moze edytowac swoje towary, wiec ma ich spis, chcialbym mu pokazac ktory towar jest oferta ktory potrzeba a ktory tym i tym.

ale tutaj juz nie chcialbym zeby sie powtarzaly te same wiersze, chcialbym zeby to wygladalo mniej wiecej tak:
Kod
jakas nazwa_towaru | oferta potrzeba | jakas data_dodania
jakas nazwa_towaru2 | potrzeba | jakas data_dodania
jakas nazwa_towaru3 | oferta | jakas data_dodania
jakas nazwa_towaru4 | potrzeba | jakas data_dodania
jakas nazwa_towaru5 | oferta | jakas data_dodania


chodzi o to jak przekazac to ladnie do szablonu Smarty
bo teraz przekazuje normalnie towary tego usera. ale zeby sprawdzic czy to jest oferta czy potrzeba to musze miec id tego towaru, a w smarty musialbym uzyc php zeby utworzyc nowe zapytanie.

czy musze dla kazdego towaru robic osobne zapytanie pobierajace czy to jest oferta czy potrzeba?
czy moze da sie jakos to polaczyc w mysql zeby wynik byl gotowy do wstawienia w szablonie?

teraz to w php polaczylem i przekazalem do smarty gotowa tablice.
ale jak user bedzie mial 1000 towarow to bedzie dodatkowych 1000 zapytan dla kazdego towaru zeby sprawdzic jaki to rodzaj jest.

cos takiego by sie przydalo:
  1. SELECT *, concat((SELECT rodz_nazwa FROM rodzaje)) AS rodzaj FROM towary


sa jakies inne funkcje ktore moglyby cos takiego zrobic?
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.