![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 26 Pomógł: 0 Dołączył: 5.08.2011 Ostrzeżenie: (0%) ![]() ![]() |
Witam, prosze o pomoc w następującym problemie:
1. mamy dwie tablice ->tablica '$table_name' zawierająca dane dotyczące autorów publikacji Kod id, number, surname gdzie w kolumnie 'number' podany jest kod numeryczny przypisany do danego autora (np. 10287), a w kolumnie 'surname' jego nazwisko ->tablica '$table_name2' zawierająca dane pozycji (publikacji) Kod id, author, language gdzie w kolumnie 'author' podane są kody numeryczne autorów danej publikacji (oddzielone przecinkiem jeśli więcej niż 1), a w kolumnie 'language' podany jest kod języka w którym opublikowany jest artykuł (np. dla języka angielskiego to 826 a dla polskiego to 616, zawsze pojedyńczy kod) 2. w wyniku zapytania do bazy chciałbym uzyskać listę autorów ale tylko tych którzy 'popełnili' artykuł w zadanym języku. Dobrze by też było uzyskać ich ilość. 3. wykreowałem poniższe zapytanie Kod query("SELECT `$table_name`.* FROM `$table_name`, `$table_name2` WHERE `$table_name`.number = `$table_name2`.author AND `$table_name2`.language = '$language' GROUP BY `$table_name`.number ORDER BY `$table_name`.surname ASC "); które działa poprawnie jeśli jest tylko jeden autor publikacji, przy kilku już nie nie. Wiem dlaczego tak się dzieje ale nie potrafię skonstruować właściwego zapytania aby uwzględniło także wpisy w których jest więcej autorów niż 1. |
|
|
![]() |
![]()
Post
#2
|
|
![]() Grupa: Moderatorzy Postów: 36 557 Pomógł: 6315 Dołączył: 27.12.2004 ![]() |
To jest Twoja struktura? Możesz ją poprawić?
-------------------- "Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista "Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer |
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 26 Pomógł: 0 Dołączył: 5.08.2011 Ostrzeżenie: (0%) ![]() ![]() |
Poprawić zawsze można oby tylko z sensem. Choć po Tobie raczej ciężko się spodziewać bezsensownych sugestii
![]() Ten post edytował unsec 19.11.2014, 17:54:16 |
|
|
![]()
Post
#4
|
|
![]() Grupa: Moderatorzy Postów: 36 557 Pomógł: 6315 Dołączył: 27.12.2004 ![]() |
No chodzi o to, że masz złą strukture, ze trzymasz wszystkich autorow w jednym polu po przecinku. Tak sie nie robi. To sie robi tak:
tabela AUTOR tabela POZYCJA - bez pola autor tabela AUTOR_POZYCJA a w niej pola AUTOR - wskazanie na autora POZYCJA - wskazanie na pozycje Dzieki takiej strukturze bez problemu robi sie wszystko -------------------- "Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista "Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer |
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 26 Pomógł: 0 Dołączył: 5.08.2011 Ostrzeżenie: (0%) ![]() ![]() |
hmm, rozumiem Twój tor rozumowania, sporo zmian w kodzie by było.
Starałem się rozwiązac problem przy pomocy Kod WHERE `$table_name`.tag_number IN (`$table_name2`.tag) ale daje taki sam wynik jak wcześniej czyli dla pojedyńczego autora a dla kilku np. "10287,10101,10045" już nie. A wydawałoby sie że powinno idealnie rozwiązać problem. |
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 6 806 Pomógł: 1828 Dołączył: 11.03.2014 Ostrzeżenie: (0%) ![]() ![]() |
-------------------- |
|
|
![]()
Post
#7
|
|
Grupa: Zarejestrowani Postów: 26 Pomógł: 0 Dołączył: 5.08.2011 Ostrzeżenie: (0%) ![]() ![]() |
@trueblue - serdeczne dzięki
dodałem jeszcze Kod GROUP BY ... i w efekcie otrzymałem to samo co przy kodzie Kod query("SELECT `$table_name`.* FROM `$table_name` ORDER BY surname ASC "); czyli listing WSZYSTKICH autorów bez względu czy napisał czy nie napisał. a że potem mam zapytanie z COUNT to widzę ile razy występuje każdy autor. No i z Twoim WHERE wyświetla mi także autorów z (0), czyli takich których być nie powinno. Natomiast po dodaniu do Twojego WHERE Kod AND `$table_name2`.language = '$language' znikają mi "(0) autorzy". Co, teoretycznie jest logiczne, ale myślałem że sam CONCAT wystarczy do odsiewu a "language" bedzie tylko zabezpieczeniem dla danego języka. -------------------- Autorów mam już sporo i "na oko" nie wiem czy wszystko działa poprawnie. Postanowiłem rzecz przetestować. Usunąłem "abezpieczenie "AND language". Wprowadziłem do bazy nowego autora "Test". Teoretycznie, powinno go wyświetlić jako "(0) Test" ale nie wyświetla go w ogóle. Ten post edytował unsec 19.11.2014, 20:46:14 |
|
|
![]()
Post
#8
|
|
Grupa: Zarejestrowani Postów: 6 806 Pomógł: 1828 Dołączył: 11.03.2014 Ostrzeżenie: (0%) ![]() ![]() |
Pokaż całe zapytanie.
-------------------- |
|
|
![]()
Post
#9
|
|
Grupa: Zarejestrowani Postów: 26 Pomógł: 0 Dołączył: 5.08.2011 Ostrzeżenie: (0%) ![]() ![]() |
brrrrrrrr, sorry, wszystko działa wyśmienicie.
Nie dawało mi spokoju dlaczego wyświetla niektórych z (0) a "Test" nie. Okazało sie że tych co wyświetla z (0) to napisali artykuł, owszem, ale w języku polskim i dlatego znikali po zastosowaniu "AND language" Natomiast "Test" nigdy nic nie napisał więc CONCATE na dzień dobry go odsiało. Już teraz rozumiem jak działają wszystkie elementy tego zapytania i serdecznie dziękuję za pomoc, obu kolegom. Miłego wieczoru życzę ![]() Ten post edytował unsec 19.11.2014, 21:03:10 |
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 25.07.2025 - 01:05 |