Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][MySQL] zapytanie z dwoma tablicami
Forum PHP.pl > Forum > Przedszkole
unsec
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.
nospor
To jest Twoja struktura? Możesz ją poprawić?
unsec
Poprawić zawsze można oby tylko z sensem. Choć po Tobie raczej ciężko się spodziewać bezsensownych sugestii smile.gif)
nospor
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
unsec
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.
trueblue
  1. WHERE CONCAT(',',`$table_name2`.author,',') LIKE CONCAT('%,',`$table_name`.number,',%');
unsec
@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.
trueblue
Pokaż całe zapytanie.
unsec
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ę smile.gif.
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.