-Bart-
3.06.2013, 15:32:41
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
3.06.2013, 16:21:02
poczytaj o JOIN w zapytaniach SQL
-Bart-
3.06.2013, 16:46:12
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-
3.06.2013, 16:51:23
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
3.06.2013, 16:56:59
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ć
hondek
3.06.2013, 16:57:47
a GROUP BY?
-Bart-
3.06.2013, 17:01:15
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-
3.06.2013, 17:11:47
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-
3.06.2013, 17:14:31
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
3.06.2013, 17:39:54
Pokaż zawartość obu tabel i oczekiwany wynik.
-Bart-
3.06.2013, 17:49:55
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-
3.06.2013, 18:42:28
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
3.06.2013, 21:59:20
Pokaż zawartość obu tabel i oczekiwany wynik.
hondek
3.06.2013, 22:08:12
TU jest dopiero łamigłówka
-Bart-
3.06.2013, 23:39:52
Co do wpisu mmmmm odpowiadam - wyżej przedstawiłem zawartość obu tabel i cel, który chcę osiągnąć. Przeczytaj dokładnie.
-Bart-
3.06.2013, 23:43:31
Ł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-
4.06.2013, 00:03:56
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-
4.06.2013, 01:41:48
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
4.06.2013, 07:18:16
CREATE TABLE um
(idu int NOT NULL PRIMARY KEY,
um varchar(200) NOT NULL UNIQUE);
INSERT INTO um VALUES(1, 'znajomosc systemów operacyjnych'), (2, 'umiejętność szybkiego pisania na klawiaturze'), (3, 'bardzo dobra znajomość języka angielskiego');
CREATE TABLE umd
(id1 int NOT NULL PRIMARY KEY,
idu1 int NOT NULL,
dod varchar(200) NOT NULL UNIQUE);
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?
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-
4.06.2013, 11:20:50
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.