[PHP]Porównanie danych z dwóch tabel php (warunek IF)...? |
[PHP]Porównanie danych z dwóch tabel php (warunek IF)...? |
25.11.2009, 11:35:43
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ć Męczyłem się już array, array_diff a może wystarczy zwykłe if ? Pomoże ktoś? Dzięki |
|
|
25.11.2009, 13:57:48
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. -------------------- |
|
|
25.11.2009, 14:06:52
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 Każdy więc przebieg pętli daje nam szansę na skrócenie kolejnych. 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
|
|
|
25.11.2009, 19:45:59
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. |
|
|
25.11.2009, 21:16:50
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 Masz w tej chwili dwie dwuwymiarowe tablice. Pierwsza z nich jest postaci:
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 Z każdym krokiem pierwszej pętli foreach (czyli z kolejnymi userami) druga tablica się zmniejsza i niejako działanie przyspiesza. Możesz jeszcze ewentualnie ustawić w miejscu oznaczonym "size_checker" warunek, że jeśli wielkość $array2 będzie 0 to ma zrobić break i wyjść z foreach na amen. Wtedy pozbędziesz się być może wielu pustych przejść pętli. -------------------- 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
|
|
|
26.11.2009, 20:54:32
Post
#6
|
|
Grupa: Zarejestrowani Postów: 34 Pomógł: 0 Dołączył: 15.02.2009 Ostrzeżenie: (0%) |
Dziękuję Działa ale to tylko część efektu który chcę osiągnąć więc dalej proszę o pomoc.
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 |
|
|
26.11.2009, 21:06:45
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
|
|
|
26.11.2009, 21:52:29
Post
#8
|
|
Grupa: Zarejestrowani Postów: 34 Pomógł: 0 Dołączył: 15.02.2009 Ostrzeżenie: (0%) |
hmm... rozważałem taką opcję ale..
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ę? |
|
|
26.11.2009, 22:00:32
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 ...) Tylko w przypadku porównywania wielu opcji nie usuwaj wierszy, bo jeden może pasować do wielu. -------------------- 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
|
|
|
27.11.2009, 10:39:02
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 |
|
|
27.11.2009, 13:09:02
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 ? Skoro 2 foreach ma 13 rekordów, a 3 ma 1 rekord, to w wyniku masz 13 razy 1 rekord Gdyby rekordów było więcej to masz x razy y rekordów w ostatnim foreach Pomyśl zanim zaczniesz zagnieżdżać za bardzo.
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
|
|
|
27.11.2009, 15:00:31
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 |
|
|
27.11.2009, 15:50:52
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? Robiąc tak jak robisz nadpisujesz sobie zmienne od $a do $h cały czas. W sumie tak patrząc z innej perspektywy to skoro rozszerzona była tablica $users to masz nie tyle znowu ją gdzieś jeszcze raz przepychać jako trzecią, tylko sprawdzać kolejne jej wartości, każdą wartość z $users porównując z odpowiednią wartością w drugiej tablicy.
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
|
|
|
30.01.2023, 12:16:58
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 |
|
|
30.01.2023, 18:31:58
Post
#15
|
|
Grupa: Zarejestrowani Postów: 3 033 Pomógł: 366 Dołączył: 24.05.2012 Ostrzeżenie: (0%) |
a sprawdź co masz w tym array i array2
|
|
|
30.01.2023, 18:49:35
Post
#16
|
|
Grupa: Zarejestrowani Postów: 6 761 Pomógł: 1822 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 -------------------- |
|
|
31.01.2023, 10:07:22
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 |
|
|
31.01.2023, 11:04:45
Post
#18
|
|
Grupa: Zarejestrowani Postów: 6 761 Pomógł: 1822 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. -------------------- |
|
|
31.01.2023, 11:20:37
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 |
|
|
31.01.2023, 12:19:33
Post
#20
|
|
Grupa: Zarejestrowani Postów: 6 761 Pomógł: 1822 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: 27.04.2024 - 06:54 |