![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 945 Pomógł: 7 Dołączył: 15.03.2005 Skąd: katowice Ostrzeżenie: (0%) ![]() ![]() |
mam kłopot z relacją. Mysql dziwnie sie zachowuje mimo tego, że oczekuje czego innego.
mam takie zapytanie:
pobiera liste kategori i liczy ile w danej jest rekordów i sumuje kolumne count. Na chwile obecna działa tylko wtedy gdy jest jakis element w danej kategori ale jak nie ma zamiast pokaza 0 to go nie wyswetla mimo tego ze mam LEFT. RIGHT i INNER tak samo Pod zapytania niewchodzą w gre. Kilka z was moze zdziwic ze 2 razy podaje jezyk dla roznych tabel ale inaczej nie działa :/ |
|
|
![]() |
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 69 Pomógł: 0 Dołączył: 22.07.2007 Ostrzeżenie: (0%) ![]() ![]() |
Jak rozumiem tabele wyglądają następująco :
Tabela ‘cat’ : + id + title + userid + sort + lang + parent Tabela ‘documents’ + id + cat + count +lang , gdzie ‘cat.id‘ jest kluczem głównym, a ‘documents.cat’ jest kluczem obcym tabeli ‘cat’. Możesz na początek spróbować zapytania bez tych warunków IFNULL i zobaczyć co zwraca MySQL.
Zapytanie powinno ci zwrócić listę kategorii nadrzędnych (‘parent’ = 0), gdzie w kolumnach sum_documents i count_documents będą odpowiednie wartości w przypadku gdy istnieją jakieś dokumenty w odpowiedniej kategorii lub NULLe, gdy takich nie będzie. Teraz możesz dołożyć warunek IFNULL, żeby sprawdzić czy poprawnie NULLe będą zamieniane na 0.
Jeżeli to zadziała to możesz dodać resztę warunków, które potrzebujesz. Niestety nie mam pod ręką MySQL, więc nie mogę sprawdzić osobiście, ale na moje oko powinno działać. PS. podawaj następnym razem schemat tabel - oszczędzi trochę czasu . |
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 945 Pomógł: 7 Dołączył: 15.03.2005 Skąd: katowice Ostrzeżenie: (0%) ![]() ![]() |
prawie .. ale mimo tego ze jest daje WHERE cat.Lang = 'Polski' np to liczy we wszystkich jezykach a powinno tylko w polskim
|
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 69 Pomógł: 0 Dołączył: 22.07.2007 Ostrzeżenie: (0%) ![]() ![]() |
A może masz w bazie zapisane 'polski' z małej a nie z dużej litery ?
Pokaż klika rekordów z obu tabel to będziemy mogli się zastanowić dlaczego to nie działa. |
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 945 Pomógł: 7 Dołączył: 15.03.2005 Skąd: katowice Ostrzeżenie: (0%) ![]() ![]() |
http://www.cabin.pl/frontend/baza.sql
tam jest kilka rekordów przypisanych do roznych przykladowych jezykow... Ten post edytował acztery 23.08.2007, 10:46:40 |
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 69 Pomógł: 0 Dołączył: 22.07.2007 Ostrzeżenie: (0%) ![]() ![]() |
Nie wiem, czy to ty czy ktoś napisał strukturę tej bazy, ale jest... zła. Przede wszystkim ktoś nie rozróżnia po co są typy danych i do czego służą.
Przykład pierwszy z brzegu : Tabela ‘cat’
Identyfikator zapisany w postaci stringa ? W dodatku 255 znakowego ? Do zapisu klucza głównego używa się integera i tworzy indeks – wtedy baza przeszukuje rekordy o wiele szybciej . Tak samo jak w tabeli ‘documents’
z poprzednich postow wnioskuje ze jest to klucz obcy do tabeli ‘cat’ – też powinien być integerem. Następna sprawa, chociażby w tabeli ‘cat’
Po co ci tyle miejsca na date ? Żeby to dobrze działało przede wszystkim trzeba zmienic strukture tej bazy, bo w przeciwnym razie będą się pojawiac nieoczekiwane bledy, trudne do zdiagnozowania. Co do języka
czy naprawdę potrzebujesz aż 255 znaków, zeby zapisać informacje o języku ? zmniejsz te pole np. do 2 czy 3 znaków i wpisuj tam informacje w postaci np.’pol’, ‘eng’. Wtedy zapytanie zwracające sumę oraz ilość dokumentów w języku polskim dla każdej kategorii głównej w języku polskim mogloby wygladac tak:
Generalnie – przepisz ta baze z uwzglednieniem zastosowania odpowiednich typow do przetrzymywanych danych. |
|
|
![]()
Post
#7
|
|
Grupa: Zarejestrowani Postów: 945 Pomógł: 7 Dołączył: 15.03.2005 Skąd: katowice Ostrzeżenie: (0%) ![]() ![]() |
wiem wiem zmieniam te struktre od zawsze ale jaks czasu nie mam teraz bede musial go sobie wygospodarować.
Co do Id dokumentu musze tak mieć bo np ja tworze id dla dokumentu na podstawie tytułu dla tytułu ala ma kota id = ala_ma_kota jak tam to na jakac cyfre to przy tworzeniu innych dokumentów zacznie robic sie balag i bede rozne id dla roznych wersji jezykowych np. powinno byc ala_ma_kota | Polski ala_ma_kota | Niemiecki i tak analogicznie jak dam cyfry z czego auto_incordet odpada bylo by tak 34343 | Polski 34323 | Niemiecki a jak wyswetlam jakis dokument to na podstawie ID i prefixu jezykowego ale tak czy siak musze to zmienic inne rzeczy ktore napisałes ok zapytanie ktore podales zwraca to samo co moje ale dzieki jak zmieni struktre itp dam znac i zobaczymy co wtedy da sie wymyslec Ten post edytował acztery 23.08.2007, 12:55:28 |
|
|
![]()
Post
#8
|
|
Grupa: Zarejestrowani Postów: 69 Pomógł: 0 Dołączył: 22.07.2007 Ostrzeżenie: (0%) ![]() ![]() |
To dziwne, ze zapytanie nie zwraca tego co trzeba - a moze w tabeli 'documents' w polu 'cat' wszystkie pola sa powiazane z polem 'id' w tabeli 'cat' (czyli LEFT JOIN dziala tak jak OUTER JOIN bo nie ma zadnych "krotek wiszących" = czyli kazdy wpis w kolumnie 'cat' w tabeli 'documents' ma swoj odpowiednik w kolumnie 'id' w tabeli 'cat') ?
Co do struktury to rozwiązanie wg. mnie z trzymaniem stringa jako klucza, zeby wydobyc jezyk jest nie do konca optymalne. Mozesz sprobowac przemodelowac tak baze, zeby nazwy kategorii i dokumentow umieszczac w innych tabelach w odpowiednich jezykach i polaczyc je za pomoca klucza obcego. |
|
|
![]()
Post
#9
|
|
Grupa: Zarejestrowani Postów: 945 Pomógł: 7 Dołączył: 15.03.2005 Skąd: katowice Ostrzeżenie: (0%) ![]() ![]() |
wlasnie tak robie. jak nie pomoze to zrobie to na skróty tj. jak liczy mi wszystkie rekordy ze wszystkich jezykow to ilosc wszystkich rek/ilosc jezykow da mi ilosc rekordow dla 1 jezyka :/ ale to najgłupsze wyjscie jakie moze byc
|
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 14.08.2025 - 06:28 |