![]() |
![]() ![]() |
![]() |
![]() ![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 34 Pomógł: 0 Dołączył: 15.02.2009 Ostrzeżenie: (0%) ![]() ![]() |
Mam sobie kod:
<?php $conn = mysql_connect("xxx","xxx","xxx"); mysql_select_db("xxx"); if (mysql_errno()) { echo mysql_error() . ": " . mysql_errno() . "<br>n"; exit; } $query = "SELECT user FROM matryca group by user"; $result = mysql_query($query) or die(mysql_error()); $num_rows = mysql_num_rows($result); for ($i=0; $i<$num_rows; $i++) { $wiersz = mysql_fetch_array($result); echo "<br />"; echo "<td>".$wiersz["user"]."</td>"; echo "</td>"; } $query = "SELECT usersl, logi, badi, inne FROM Dane order by usersl"; $result = mysql_query($query) or die(mysql_error()); $num_rows = mysql_num_rows($result); for ($i=0; $i<$num_rows; $i++) { $wiersz = mysql_fetch_array($result); echo "<td>".$wiersz["usersl"]."</td>"; echo "</td>"; } ?> Chciałbym w jakiś sposób porównać wynik z query 1 tak aby do każdego unikalnego "User" odnalazł pasujące dane z query 2 i wyświetlił dane w postaci identycznych rekordów. Czyli dla User z bazy 1 znalazłem "jakieś" rekordy które zawierają sie w query 2 dla dla User z query 1. Podobne rozwiązanie zrobiłem MYSQL ale interesuje mnie rozwiązanie w PHP. Kompletnie nie wiem jak się za to zabrać ![]() Dzięki |
|
|
![]()
Post
#2
|
|
![]() Grupa: Zarejestrowani Postów: 259 Pomógł: 42 Dołączył: 8.04.2005 Skąd: Mława Ostrzeżenie: (0%) ![]() ![]() |
zacznij od zapoznania się z: http://www.php.net/manual/en/ref.array.php
w tych funkcjach na pewno znajdziesz coś dla siebie. -------------------- |
|
|
![]()
Post
#3
|
|
![]() Grupa: Moderatorzy Postów: 4 362 Pomógł: 714 Dołączył: 12.02.2009 Skąd: Jak się położę tak leżę :D ![]() |
W zależności od struktury danych jedynie inaczej byś na pętlach używał wyszukiwania elementów w drugiej tablicy.
W najwyższej pętli byś wybierał klucz wyszukiwania. Potem używał szukajki w drugiej tablicy i zwracał pewne wyniki, które obrabiałbyś. Potem kolejny klucz szukania i tak w kółko... EDIT: Tutaj miałbyś szukanie po user z query1 i wpisy w query2 dla kolumny usersl zwykłym porównaniem No chyba, że znasz dokładnie klucz nazwy usera szukanego to najbardziej zewnętrzny foreach leci i tylko wewnętrzny jest w użyciu. Oczywiście najszybsza implementacja polega na optymalizacji. Jakiej? Userowie w $query1 są różni a tabela $query 2 w każdym przebiegu nie tylko szuka ale w przypadku znalezienia pasującego rekordu, po wypisaniu danych na ekran czy do jakiegokolwiek strumienia, usuwa go ![]() Ten post edytował thek 25.11.2009, 14:19:18 -------------------- Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
|
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 34 Pomógł: 0 Dołączył: 15.02.2009 Ostrzeżenie: (0%) ![]() ![]() |
[font="Times New Roman"][size="3"] Thek,
doradź jeszcze proszę jak to osadzić w kodzie.. Rozumiem, że w pierwszej pętli robię klucz:
Może tutaj jakoś już łatwo z arraya porównywać ? Tylko problem w tym, że nie mogę dojść jak.. in_array myślę, że będzie najbardziej odpowiednie tylko jak.. Foreach'em też zapewne się da.. Blokada zaczyna mi się na samym początku.. if(.... Dzięki za wszelkie porady. |
|
|
![]()
Post
#5
|
|
![]() Grupa: Moderatorzy Postów: 4 362 Pomógł: 714 Dołączył: 12.02.2009 Skąd: Jak się położę tak leżę :D ![]() |
To zerknij sobie na spokojnie i pomyśl gdzie robisz porównanie
![]()
druga zaś to:
lub coś w ten deseń. Popatrz w jakich indeksach masz userów i co się zmienia ![]() To tablica tablic. Zmienia sie pierwszy indeks a user jest zawsze w indeksie 0 drugiego wymiaru w obu przypadkach. Wystarczy więc, że zrobisz foreach idący po tablicy userów i sprawdzający czy w drugiej pętli występuje również w tym samym miejscu ta sama osoba. W efekcie sprowadza się to do: Możesz optymalizować poprzez wyrzucanie potem odpowiedniego klucza z drugiej tablicy. Sprawi to fajną rzecz bo zmniejsza ową tablicę z danymi i gdy pętla przeskoczy do następnego usera, to danych będzie mniej, a więc będzie mniej pustych przebiegów i mniej if-ów ![]() -------------------- Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
|
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 34 Pomógł: 0 Dołączył: 15.02.2009 Ostrzeżenie: (0%) ![]() ![]() |
Dziękuję
![]() Teraz trochę skomplikuję. Tabela 1 jak i Tabela 2 może mieć różną ilość rekordów. Tabelę 1 i 2 łączy ta sama nazwa "user" . Array 1 Array 2 Chciałbym porównać nie tylko po "user" z query1: "SELECT user FROM matryca group by user"; ale także po innych wartościach - przykład: "SELECT user, logi, badi FROM matryca"; do "SELECT usersl, logisl, badisl, innesl FROM Dane"; Cel to wyświetlenie wszystkich danych plus te unikalne z dwóch tabel. Z przykładu który wcześniej podawałem wyciągam dane tylko porównując tab 1 z tab 2 a teraz chodzi o zrobienie w drugą stronę. Czy mam zrobić kolejne query 3 i 4 plus array3 i array4 a później to jakoś porównać czy jest jakiś inny sposób? Jeżeli array3 i array4 to jak później pokazać, powiązać z array1 i array2. Mam nadzieje że w miarę jest to zrozumiałe ![]() dzięki http://www.php.net/array |
|
|
![]()
Post
#7
|
|
![]() Grupa: Moderatorzy Postów: 4 362 Pomógł: 714 Dołączył: 12.02.2009 Skąd: Jak się położę tak leżę :D ![]() |
No to wtedy jedynie zmieniasz odpowiednio warunek w IF, by pasował do Twojego problemu. Nic więcej
![]() -------------------- Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
|
|
|
![]()
Post
#8
|
|
Grupa: Zarejestrowani Postów: 34 Pomógł: 0 Dołączył: 15.02.2009 Ostrzeżenie: (0%) ![]() ![]() |
hmm... rozważałem taką opcję
![]() W przykładzie powyżej w array1 miałem tylko jedną wartość "users" Teraz tych wartości będzie więcej: $array[$i] = array($wiersz["usersl"], $wiersz["levelsl"], $wiersz2["NAMEsl"]); $array2[$j] = array($wiersz2["user"], $wiersz2["emp"], $wiersz2["level"], $wiersz2["NAME"]); jak zrobić w takim przypadku foreach:
Powyżej było prosto. Była jedna wartość którą szukałem w 2 tabeli ale jak wartości jest więcej..?
Dobrze myślę? |
|
|
![]()
Post
#9
|
|
![]() Grupa: Moderatorzy Postów: 4 362 Pomógł: 714 Dołączył: 12.02.2009 Skąd: Jak się położę tak leżę :D ![]() |
Myślisz w dobrym kierunku. Możesz to określić odrębnymi if jeśli będziesz robić z nimi różne rzeczy, lub jeśli za każdym razem to samo, to już w jednym IF stosując kwantyfikator OR:
if(user[0] == user2[0] OR user[1] == user2[1] OR ...) ![]() -------------------- Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
|
|
|
![]()
Post
#10
|
|
Grupa: Zarejestrowani Postów: 34 Pomógł: 0 Dołączył: 15.02.2009 Ostrzeżenie: (0%) ![]() ![]() |
Mój foreach:
W moim przypadku na user'a (jakiegoś) mam: - w tabeli 1: 13 rekordów - w tabeli 2: 1 rekord Efekt jest taki że jak to wrzucam w tabelę to w lewej kolumnie mam 13 elementów a w drugiej kolumnie mam powielony 13 razy jeden element z kolumny 2. IFami mi nie wychodzi.. Tzn wychodzi mi ale pokazuje tylko 1 rekord z tabeli 1 i tabeli 2 co nie jest zgodne z danymi z bazy. Chciałbym żeby w polach gdzie nie ma odpowiedniego elementu była pusta wartość a nie powielenie.. Mogę to jakoś zrobić? Dzięki |
|
|
![]()
Post
#11
|
|
![]() Grupa: Moderatorzy Postów: 4 362 Pomógł: 714 Dołączył: 12.02.2009 Skąd: Jak się położę tak leżę :D ![]() |
To ja się pytam... Czemu zagnieżdżasz 3 foreach wewnątrz 2 zamiast umieścić 3 foreach PO 2 ?
![]() ![]() ![]() Ten post edytował thek 27.11.2009, 13:10:09 -------------------- Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
|
|
|
![]()
Post
#12
|
|
Grupa: Zarejestrowani Postów: 34 Pomógł: 0 Dołączył: 15.02.2009 Ostrzeżenie: (0%) ![]() ![]() |
Oczywiście racja, moje niedopatrzenie.
tylko teraz jako wynik dostaję 1 rekord z tabeli I jeden rekord z tabeli II ![]() |
|
|
![]()
Post
#13
|
|
![]() Grupa: Moderatorzy Postów: 4 362 Pomógł: 714 Dołączył: 12.02.2009 Skąd: Jak się położę tak leżę :D ![]() |
A gdzie zgubiłeś IFy?
![]()
Proszę... Myśl trochę sam bo to jest logika a na tym się opiera całe programowanie. Jeśli nie potrafisz myśleć logicznie to. Ja powoli widząc wyrywki Twojego kodu zaczynam się gubić co gdzie robisz i skąd biorą się nowe tablice oraz co zawierają. Dla mnie w tej chwili powinieneś mieć tylko dwie. Jedna z userami i ich danymi, a druga to jakaś rozszerzona. Wybierasz odpowiednie kolumny do porównania i jedziesz z tym koksem w sposób jak zaprezentowałem powyżej, tyle że zachowując odpowiednią pozycję kolumn. Jeśli masz w tych tablicach inną to zmieniasz odpowiednio i tyle. Jedyne co możesz zrobić dodatkowo to odpowiednio buforować wyniki by na końcu pętli lub kroku je wyświetlać, zależnie od upodobania. -------------------- Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
|
|
|
![]()
Post
#14
|
|
Grupa: Zarejestrowani Postów: 5 Pomógł: 0 Dołączył: 30.01.2023 Ostrzeżenie: (0%) ![]() ![]() |
Witam
Co zrobić gdy, mają się nie zgadzać.
W/w przykład nie działa Ten post edytował klez 30.01.2023, 13:19:18 |
|
|
![]()
Post
#15
|
|
![]() Grupa: Zarejestrowani Postów: 3 034 Pomógł: 366 Dołączył: 24.05.2012 Ostrzeżenie: (0%) ![]() ![]() |
a sprawdź co masz w tym array i array2
![]() |
|
|
![]()
Post
#16
|
|
Grupa: Zarejestrowani Postów: 6 799 Pomógł: 1827 Dołączył: 11.03.2014 Ostrzeżenie: (0%) ![]() ![]() |
Jeśli dane pochodzą z bazy, to znalezienie danych, które są w tabeli 1, a których brak w tabeli 2 i vice versa, można osiągnąć z pomocą zapytania OUTER JOIN bezpośrednio na bazie.
Jeśli silnik nie obsługuje OUTER JOIN, to: https://kawalekkodu.pl/gul-gul-na-full-czyl...er-join-w-mysql Ten post edytował trueblue 30.01.2023, 18:50:00 -------------------- |
|
|
![]()
Post
#17
|
|
Grupa: Zarejestrowani Postów: 5 Pomógł: 0 Dołączył: 30.01.2023 Ostrzeżenie: (0%) ![]() ![]() |
to są 2 oddzielne bazy. zastosowanie JOIN nic nie daje.
ale chcę sprawdzić czego mi brak w danych
i to nie działa ![]() |
|
|
![]()
Post
#18
|
|
Grupa: Zarejestrowani Postów: 6 799 Pomógł: 1827 Dołączył: 11.03.2014 Ostrzeżenie: (0%) ![]() ![]() |
1. Nie JOIN, a OUTER JOIN.
2. Możliwe jest wykonywanie zapytania łączącego tabele z dwóch oddzielnych baz. 3. W Twoim kodzie brak zapytań SQL - dane nie pojawią się znikąd. -------------------- |
|
|
![]()
Post
#19
|
|
Grupa: Zarejestrowani Postów: 5 Pomógł: 0 Dołączył: 30.01.2023 Ostrzeżenie: (0%) ![]() ![]() |
zapytania SQl
pierwszego jeszt 116 array
a drugiego 41
i chce wiedziec jakich barkuje zeby było 116 z prawiei i 116 z lewej Ten post edytował klez 31.01.2023, 12:24:01 |
|
|
![]()
Post
#20
|
|
Grupa: Zarejestrowani Postów: 6 799 Pomógł: 1827 Dołączył: 11.03.2014 Ostrzeżenie: (0%) ![]() ![]() |
1. Nie wiem czy masz zdefiniowane $limg oraz $limh.
2. Do porównania należałoby raczej użyć array_intersect/array_diff/porównania całych tablic (==). -------------------- |
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 12.06.2025 - 10:39 |