Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP] Zmiana rekordu mysql gdy wystepuja roznice w 2 tablicach
Forum PHP.pl > Forum > Przedszkole
jaro74
Witam

musze wykonac POZORNIE jak dla mnie prosta operacje na 2 tablicach

w tablicy jos_comprofiler mam 3 pola cb_001 , cb_002 i cb_idwlasciciel

jesli pola cb_002 i cb_idwlasciciel sie roznia od siebie wowczas w tablicy jos_users w polu 'block' ma zmienic wartosc 0 na 1 wg wspolnego mianownika cb_001 = username

w tej chwili mam 1 uzytkownika, ktory ma rozne pola 'cb_002' i 'cb_idwlasciciel' i zamiast zmienic mi tylko jego zmienia mi wszystkich


Kod
//username   tabela jos_users
//block tabela jos_users
//cb_001 tabela jos_comprofiler
//cb_002   tabela  jos_comprofiler
//cb_idwlasciciel tabela   jos_comprofiler

mysql_select_db($db2,$connection1);
// wybieram z  tabel  rekordy ktore  maja zgodne  cb_001=username ale rozne  cb_002<>cb_idwlasciciel
$sql ="SELECT * FROM  jos_comprofiler, jos_users where jos_comprofiler.cb_001 = jos_users.username and jos_comprofiler.cb_002<>jos_comprofiler.cb_idwlasciciel";
$results = mysql_query($sql);  
while($rek = mysql_fetch_array($results)){

$usr = $rek['username'];
$bl = $rek['block'];
$cb001 = $rek['cb_001'];
$cb002 = $rek['cb_002'];
$cb_idw = $rek['cb_idwlasciciel'];

//  aktalizuj pole block w tabeli jos_user wowczas gdy rekordy ktore  maja zgodne  cb_001=username ale rozne  cb_002<>cb_idwlasciciel
mysql_query("UPDATE jos_users SET block = '1' where $cb002<>$cb_idw and  $cb001=$usr ")or die("<br> jos_users not updated. Error is: " . mysql_error());             

print $usr.' > '.$bl.' >'.$cb001.' > '.$cb002.' >'.$cb_idw.' ';
}


jakieś sugestie ? nie ma mocnych na ten problem ?

nie no, serio nikt nie potrafi rozwiazac problemu ?
Noidea
Wyświetl sobie w przeglądarce oba zapytania:
  1. $sql = "SELECT * FROM jos_comprofiler, jos_users where jos_comprofiler.cb_001 = jos_users.username and jos_comprofiler.cb_002<>jos_comprofiler.cb_idwlasciciel";
  2. echo $sql . "<br>";
  3.  
  4. // (...)
  5.  
  6. $sql2 = "UPDATE jos_users SET block = '1' where $cb002<>$cb_idw and $cb001=$usr";
  7. echo $sql2 . "<br>";
  8. mysql_query( $sql2 ) or die("<br> jos_users not updated. Error is: " . mysql_error());

i przypatrz się na sekcje WHERE.


Podpowiem, że w pierwszym zapytaniu zbudowałeś tą sekcję prawidłowo, a w drugim masz kompletne bzdury smile.gif
jaro74
wiem, ten warunek

Kod
6.$sql2 = "UPDATE jos_users SET block = '1' where $cb002<>$cb_idw and  $cb001=$usr";


wygląda logicznie i NIE DZIAŁA (zamiast wybrane pozycje zamienia wszystkie )


z tego co wywnioskowałem w manulu where działa tylko w przypadku równości a nie różnic dla tego terzeba użyć w jakiś sposób CASE w tym przypadku

poniższy kod też nie działa

Kod
mysql_query("UPDATE `jos_users` SET block = CASE WHEN ($cb002<>$cb_idw) THEN block = '1' WHEN ($cb002=$cb_idw) THEN block = '0' END");


jakieś propozycje ?
Noidea
Cytat(jaro74 @ 5.02.2011, 08:55:45 ) *
wiem, ten warunek

Kod
6.$sql2 = "UPDATE jos_users SET block = '1' where $cb002<>$cb_idw and  $cb001=$usr";


wygląda logicznie i NIE DZIAŁA (zamiast wybrane pozycje zamienia wszystkie )

Coś mi mówi, że jednak nie chciało ci się wyświetlić tego zapytania przez echo. Zapytanie działa tak jak mu kazałeś, czyli zmienia wartość `block` w wierszach spełniających warunek. A jako że wszystkie wiersze spełniają ten warunek, to zmienia we wszystkich.

Tak samo gdybyś napisał:
  1. while( 2 != 3 and 1 == 1 )
  2. {
  3. // do something
  4. }

utworzyłbyś poprawnie działającą nieskończoną pętlę, nawet jeśli niekoniecznie o to ci chodziło.


Podpowiem dwie rzeczy:
1. W zapytaniu UPDATE sekcja WHERE powinna wyglądać tak:
kolumna = wartość
a u ciebie wygląda tak:
wartość = wartość

2. W pierwszym zapytaniu wyciągasz też z bazy klucz główny tabeli `jos_users` (pewnie jakieś jos_users.id) - przyda się w zapytaniu UPDATE


Cytat
z tego co wywnioskowałem w manulu where działa tylko w przypadku równości a nie różnic

Działa w przypadku obu. Z resztą w tym pierwszym zapytaniu masz i równość i różnicę, a działa poprawnie.
jaro74
Sprawdzilem , nie zmienia , zmienia wszystkim na 1

napisz prosze całe rozwiązanie, od tygodnia się męczę z tym sad.gif

jos_comprofiler.cb_002<>jos_comprofiler.cb_idwlasciciel

to samo co

$cb002<>$cb_idw

jos_users
___________________
username | block
___________________
kowalski | 1
wisniewski | 0
___________________


jos_comprofiler

________________________________
cb_001 | cb_002 | cb_idwlasciciel
________________________________
kowalski | 00001 | 00234
wisniewski | 00002 | 00002


Kod
$sql2 = "UPDATE jos_users SET block = '1' where jos_comprofiler.cb_001 = jos_users.username and jos_comprofiler.cb_002<>jos_comprofiler.cb_idwlasciciel"


nie działa sad.gif
Noidea
Cytat
jos_comprofiler.cb_002<>jos_comprofiler.cb_idwlasciciel

to samo co

$cb002<>$cb_idw


Nie. Jakbyś wyświetlił to zapytanie, to zauważyłbyś różnicę:
  1. -- Zapytanie:
  2. SELECT * FROM jos_comprofiler WHERE jos_comprofiler.cb_002 <> jos_comprofiler.cb_idwlasciciel
  3. -- Zwróci inne wyniki niż:
  4. SELECT * FROM jos_comprofiler WHERE 00001 <> 00234
  5.  
  6. -- Analogicznie jest w przypadku UPDATE, z którym masz problemy



Jako że nie chce mi się już prowadzić tej dyskusji, to masz gotowca, który dodatkowo nie potrzebuje pierwszego zapytania ani pętli while:
  1. UPDATE jos_users, jos_comprofiler
  2. SET jos_users.block = 1
  3. WHERE jos_comprofiler.cb_001 = jos_users.username AND jos_comprofiler.cb_002 <> jos_comprofiler.cb_idwlasciciel
jaro74
wszystko sie rozchodzilo o to , ze w opcji UPDATE oprócz jos_users musiałem dodać jos_comprofiler

jos_users, jos_comprofiler SET jos_users.block = 1

już jest git , dzieki


ps

dziwne , ze od tygodnia nikt nie mogl mi tego wytlumaczyc na tym forum sad.gif




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.