Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP][MySQL] zapytanie z dwoma tablicami
unsec
post 19.11.2014, 17:33:48
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.
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 8)
nospor
post 19.11.2014, 17:37:37
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

Go to the top of the page
+Quote Post
unsec
post 19.11.2014, 17:49:25
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 smile.gif)

Ten post edytował unsec 19.11.2014, 17:54:16
Go to the top of the page
+Quote Post
nospor
post 19.11.2014, 18:20:29
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

Go to the top of the page
+Quote Post
unsec
post 19.11.2014, 19:38:10
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.
Go to the top of the page
+Quote Post
trueblue
post 19.11.2014, 19:50:28
Post #6





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


  1. WHERE CONCAT(',',`$table_name2`.author,',') LIKE CONCAT('%,',`$table_name`.number,',%');


--------------------
Go to the top of the page
+Quote Post
unsec
post 19.11.2014, 20:44:32
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
Go to the top of the page
+Quote Post
trueblue
post 19.11.2014, 20:51:52
Post #8





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


Pokaż całe zapytanie.


--------------------
Go to the top of the page
+Quote Post
unsec
post 19.11.2014, 21:01:10
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ę smile.gif.

Ten post edytował unsec 19.11.2014, 21:03:10
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 25.07.2025 - 01:05