Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP] Wybieranie informacji z tabeli
Forum PHP.pl > Forum > Przedszkole
-Bart-
Zastanawiam się jak zacząć.

Już pisałem tutaj na temat dwóch tabel um(umiejętności) i umd(umiejętności dodatkowe)

Sytuacja wygląda tak:

Znajoność sysemów operacyjnych w tabeli um posiada idu=1

W tabeli umd są 4 systemy operacyjne przypisane do znajomości systemów - mają idu1 = 1

Problem jest taki, że po wykonaniu zapytania: SELECT um.idu, um.um, umd.idu1, umd.dod FROM um , umd WHERE um.idu=umd.idu1 LIMIT 0,9

Wybiera mi 9 pierwszych pól niestety 3 razy powtarzając znajomość systemów operacyjnych. W jaki sposób wybrać 3 systemy z tabeli umd ale znajomość systemów z tabeli um wybrać tylko raz? Mam nadzieje, że nie napisałem zbyt pokrętnie;)
timon27
poczytaj o JOIN w zapytaniach SQL
-Bart-
Dzięki. Poczytałem właśnie i nawet przetestowałem, ale JOIN zrobił niestety dokładnie to samo.

W tabeli um(umiejetnosci) jest jedno pole o nazwie um = "znajomosc systemow" ale do tego pola przyporzadkowane sa 3 systemy z tabeli umd w zwiazku z tym pole um też wybiera mi 3 razy. A chciałbym, by wypisywało na ekranie (Na stronie) - tylko jedno pole z tabeli, mimo,że są trzy takie same.

Może tak będzie jaśniej. Proszę o jeszcze jakąś podpowiedź.
-Bart-
Inaczej sprawę ujmując.

Powiedzmy, że mam tabelę, która ma 10 pól . Stworzyłem ją przez połączenie 2 tabel joinem właśnie.
I teraz w tej stworzonej tabeli (kwerendzie jak kto woli) - mamy 3 pola o tej samej wartosci i 7 innych.
W jaki sposób wyświetlić pole o tej samej wartości tylko jeden raz, a pozostałe normalnie (bo ich wartość załóżmy się nie powtarza).

Z góry dziękuję za wszystkie podpowiedzi.
Miszczklawiatury
Zapisz wartości, które mają się nie powtarzać, w tablicy $tablica. Następnie, użyj takiej sprytnej funkcji:

array_unique($tablica);

I teraz w tablicy $tablica żadna wartość się nie powtarza i można wypisywać smile.gif
hondek
a GROUP BY?
-Bart-
Tablic już używałem - chociażby do stworzenia kalendarza - a Group przyznam się, że jeszcze nie;) Zaraz sprawdzę obie wersje i napiszę czy zadziałało:)
-Bart-
Group by odwróciło sytuację, ale jej niestety nie poprawiło - teraz w utworzonej kwerendzie pokazuje się jedno pole o wartosci = znajomosc systemow ale tylko jedno pole z systemem. Wybiera Windows XP brakuje Windows Vista, Windows 7 itd. To teraz przetestuję co zrobi tablica.
-Bart-
Wydaje mi się, że problem nie leży w zapytaniu do SQL tylko w sposobie wypisywania zawartości tabeli . Już kilka dni siedzę nad tym cholerstwem. Jedyna część z 6 części strony, która mi nie wychodzi.
mmmmmmm
Pokaż zawartość obu tabel i oczekiwany wynik.
-Bart-
Tabela 1 o nazwie <b>um</b>

Rekord idu (klucz podstawowy) i Rekord um

Zawartosc np. znajomosc systemów operacyjnych, umiejętność szybkiego pisania na klawiaturze, bardzo dobra znajomość języka angielskiego itp itd

Tabela 2 o nazwie <b>umd</b>

id1 (klucz podstawowy) idu1 pole = idu z pierwszej tabeli i dod (dodatkowe) - np. windows 7, windows xp, windows vista, rozne dystrybucje Linuxa - te 4 wartosci mają idu1 = 1 czyli sa podporządkowane polu um = znajomość systemów operacyjnych.

Oczekiwany wynik to wyświetlenie na ekranie np. ZNAJOMOŚĆ SYSTEMÓW OPERACYJNYCH - i tu wartosci z drugiej tabeli windows 7, windows xp itd
-Bart-
Najlepiej pokażę Wam część kodu.

Chodzi o to. Tyle, że umiejętność obsługi komputera i znajomość systemów operacyjnych ma wyświetlać się raz, a nie 3 razy, jak w tym przypadku. Oczywiście nie zapominając, że pod tym powinna być lista czterech systemów operacyjnych. Jak już dowiem się, w jaki sposób je prawidłowo wyświetlić, to będę chciał pokazywać je w tzw. spanach. Czyli po najechaniu na div pokaże się pole z systemami operacyjnymi. Ale z tym już sobie poradzę. Tylko jak prawidłowo wybrać te dane stąd:( Pomocy!

if ($page==6)
{ echo '<h3>Umiejętno¶ci</h3><center>';

$result=mysql_query("SELECT um.idu, um.um, umd.idu1, umd.dod FROM um, umd WHERE idu=idu1");
while($query_row = mysql_fetch_assoc($result))
{$idu=$query_row['idu'];
$idu1=$query_row['idu1'];
$um=$query_row['um'];
$dod=$query_row['dod'];

echo '<div id="umiejetnosc"><ul><li>',$um,'</li></div></ul>' ;

echo $dod;

}}
mmmmmmm
Pokaż zawartość obu tabel i oczekiwany wynik.
hondek
TU jest dopiero łamigłówka biggrin.gif
-Bart-
Co do wpisu mmmmm odpowiadam - wyżej przedstawiłem zawartość obu tabel i cel, który chcę osiągnąć. Przeczytaj dokładnie.
-Bart-
Łamigłówka dla mnie. Myślałem, że dla osób bardziej obeznanych w temacie (ja jestem samoukiem więc pewnie więcej nie wiem, niż wiem), to nie będzie problem.

Ja ten problem rozwiązałem i wyświetla mi się wszystko, ale nie tak, jak bym tego chciał. Znając siebie, będę nad tym siedział aż mi wyjdzie;)
-Bart-
Jeszcze inaczej. Oto co pokazuje mi się na stronie teraz:

Znajomość systemów operacyjnych

Windows XP

Znajomość systemów operacyjnych

Windows VISTA

Znajomość systemów operacyjnych

Windows 7

Znajomość systemów operacyjnych

Linux


A OTO CO MIAŁOBY SIĘ POKAZYWAĆ PRAWIDŁOWO:

Znajomość systemów operacyjnych:

Windows XP

Windows Vista

Windows 7

Linux



Bardziej konkretnie opisałem efekt, który chcę osiągnąć.





-Bart-
Mistrzostwem świata to to pewnie nie jest, ale problem udało mi się rozwiązać w taki sposób:

if ($page==6) // na stronie 6stej mojej stronki wyswietlaj

{ echo '<h3>Umiejętno¶ci</h3><center>';

//wybieranie z tabeli um
$query = mysql_query("SELECT * FROM um ORDER BY idu LIMIT 7");

while ($query_row=mysql_fetch_assoc($query)) {
$idu=$query_row['idu'];


echo "<div id='umiejetnosc'><ul><li>",$query_row['um'],'</div></li></ul>'; //wypisuje wszystkie umiejetnosci z tabeli um w postaci wypunktowanej listy

/* te dwa rekordy są puste*/ if ($idu!=5 && $idu!=7){


//wybieranie z tablicy umd
$zapytanie=mysql_query("SELECT * FROM umd");


while ( $query_row=mysql_fetch_assoc($zapytanie)){
$dod=$query_row['dod'];
$idu1=$query_row['idu1'];

//jezeli idu(um) = idu1(umd), wówczas wypisuj odpowiednie wartosci z rekordu DOD (umd)
if ($idu==$idu1)
{
echo "<div id='rozwin'><span>",$dod,"</span></div>";}}







}
echo "<br>";

Do tego dołożyłem css , odpowiednio ustawiając wygląd SPANu i po najechaniu na małą kropkę (jedna kropka to jedna informacja dodatkowa do konkretnej umiejętności) , wyświetla mi się informacja z pola dod tabeli umd (umiejetnosci dodatkowe)
mmmmmmm
  1. CREATE TABLE um
  2. (idu int NOT NULL PRIMARY KEY,
  3. um varchar(200) NOT NULL UNIQUE);
  4.  
  5. INSERT INTO um VALUES(1, 'znajomosc systemów operacyjnych'), (2, 'umiejętność szybkiego pisania na klawiaturze'), (3, 'bardzo dobra znajomość języka angielskiego');
  6.  
  7. CREATE TABLE umd
  8. (id1 int NOT NULL PRIMARY KEY,
  9. idu1 int NOT NULL,
  10. dod varchar(200) NOT NULL UNIQUE);
  11.  
  12. INSERT INTO umd value(1, 1, 'windows 7'), (2, 1, 'windows xp'), (3, 1, 'windows vista'), (4, 1, 'Linux');

To jest to o co prosiłem... Trudne, nie?
  1. SELECT um, group_concat(dod) FROM umd u JOIN um um ON um.idu=u.idu1 GROUP BY um

To jest mniej więcej to o co ty prosiłeś. Do zmodyfikowania.
-Bart-
Nie trudne. Dzięki ale już wybrnąłem z problemu. Poza tym postanowiłem to jednak trochę zmodyfikować i uprościć przenosząc wszystko do jednej tabeli i zapisując w jednej linijce. To się po prostu ma wyświetlać, więc nie ma sensu komplikować sobie. A tamto próbowałem zrobić po to, żeby nauczyć się czegoś nowego - no i mi wyszło. Twoja opcja pewnie też by zadziałała. Tyle, że tabele akurat mam już gotowe więc cała ta część z ich tworzeniem byłaby niepotrzebna. No ale dzięki, że się zainteresowałeś tematem.
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.