Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL]Porównanie dwóch tabel z wyszukaniem nieistniejących
Forum PHP.pl > Forum > Przedszkole
krzesik
Witam,

mam takie zapytanie:
  1. SELECT Nazwisko_Imie, Adres FROM uzytkownik WHERE (Nazwisko_Imie AND Adres) NOT IN (SELECT Nazwisko_Imie, Adres FROM uzytkownik1)


dostaję błąd:
#1241 - Operand should contain 1 column(s)

co jest nie tak?
trueblue
NOT IN wymaga zbioru jednokolumnowego.

Zmień zapytanie, użyj LEFT JOIN i warunki IS NULL na Nazwisko_Imie i Adres.
https://www.google.pl/search?q=mysql+not+in+left+join
krzesik
kurczę nie wiem jak to naskrobać......
trueblue
http://stackoverflow.com/questions/750343/...here-not-exists
W drugim poście jest przykład z NOT IN, w trzecim zmiana na LEFT JOIN. U Ciebie zamiast id i voter_id będzie Nazwisko_Imie.
Tu jest przykład LEFT JOIN na dwóch kolumnach: http://stackoverflow.com/a/18914740/5889778
Pamiętaj o odpowiednim warunku WHERE.
krzesik
Naprawdę się starałem, a dooopa z tego..... zerknijcie proszę..

  1. SELECT * FROM uzytkownik WHERE Nazwisko_Imie OR Adres NOT IN (SELECT Nazwisko_Imie FROM uzytkownik1)
trueblue
  1. SELECT * FROM uzytkownik AS u
  2. LEFT JOIN uzytkownik1 AS u1 ON u.Nazwisko_Imie=u1.Nazwisko_Imie AND u.Adres=u1.Adres
  3. WHERE u1.Nazwisko_Imie IS NULL AND u1.Adres IS NULL
krzesik
Super, na dwóch bliźniaczych tabelach działa dobrze, ale teraz jeszcze jeden smaczek.... ;-)
Te dwie tabele są w różnych bazach, mam zrobione tak:

  1. //połączenie do pierwszej bazy
  2. include 'config.php';
  3.  
  4. $con1 = @mysql_connect($host, $user, $pswd, false);
  5. mysql_select_db("db1",$con1);
  6.  
  7.  
  8. //połączenie do drugiej bazy
  9. include 'config_new.php';
  10.  
  11. $con2 = @mysql_connect($host_tele, $user_tele, $pswd_tele, false);
  12. mysql_select_db("db2",$con2);
  13.  
  14.  
  15. //kasowanie userow ktorzy kiedyś zostali dodani, ale już ich nie ma w bazie więc chcę usunąć w bazie bliźniaczej
  16. $Mdel = mysql_query("SELECT * FROM db2.uzytkownik AS u
  17. LEFT JOIN db1.uzytkownik AS u1 ON u.Nazwisko_Imie=u1.Nazwisko_Imie AND u.Adres=u1.Adres
  18. WHERE u1.Nazwisko_Imie IS NULL AND u1.Adres IS NULL");
  19. while($del = mysql_fetch_array($Mdel))
  20. {
  21. $Kasuj = mysql_query("DELETE FROM db2.uzytkownik WHERE IDUzytkownika='$del[IDUzytkownika]'") or die('Błąd zapytania del user all: '.mysql_error());
  22. }


gdzie mam jeszcze błąd? nic mi nie kasuje.....
trueblue
Musiałbyś mieć obydwie bazy dostępne pod jednym połączeniem.
krzesik
Jak to zrobić inaczej? Jakaś dodatkowa tabela TMP? Próbowałem z kasowanie na wejściu userów i dodawaniu tych co mają być w bazie, ale identyfikatory mi rosły w oczach, może coś w ten deseń?
LowiczakPL
dobrze kombinujesz

pobierasz sobie z jednej bazy dane nazwiska i tworzysz z tego string

Kod
$notIn = "('nazwisko', 'kolejne')";



i ten string wklejasz do zapytanie do odpytania drugiej bazy

Kod
    SELECT * FROM uzytkownik WHERE Nazwisko NOT IN $notIn
krzesik
mam na tę chwilę coś takiego:
  1. $Mdel = mysql_query("SELECT u.Nazwisko_Imie as user, u.Adres as adres FROM uzytkownik AS u
  2. LEFT JOIN uzytkownik_tmp AS u1 ON u.Nazwisko_Imie=u1.Nazwisko_Imie AND u.Adres=u1.Adres WHERE u1.Nazwisko_Imie IS NULL AND u1.Adres IS NULL");
  3.  
  4. while($d = mysql_fetch_array($Mdel))
  5. {
  6. $KasujM = mysql_query("DELETE FROM uzytkownik, uzytkownik_tmp WHERE Nazwisko_Imie='$d[user]' and Adres='$d[adres]'") or die('Błąd zapytania del user all: '.mysql_error());
  7. }


niestety to mi nie działa poprawnie. Jaka jest moja idea:
1. na stronie a.pl uruchamiany jest skrypt
- dane userów lądują w jednej bazie w tabelach uzytkownik i uzytkownik_tmp (tmp dlatego że baza wzorcowa jest na innym srv i nie jestem w stanie porównać danych "w locie")
- dochodzi do zmiany danych np jeden z userów został usunięty w bazie wzorcowej, dane lecą do tabeli uzytkownik_tmp - (ale jest tam jeszcze ten usunięty user) - jak go wywalić?



Problem rozwiązany temat do zmaknięcia
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.