Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][MySQL]Aktualizacja wartości jednym zapytaniem z nietypową budową tabeli w bazie
Forum PHP.pl > Forum > Przedszkole
Majkelo23
Jak przy takiej budowie tabeli:

Cytat
config_name | config_value
nazwa _______________ 1
nazwa2 _______________ 343434
nazwa3_______________ ifejfiesfjesifj


Zaktualizować za jednym zamachem wszystkie rekordy? Przy aktualizacji jednego, wyglądałoby to tak:

  1. UPDATE `config` SET config_value = 'wartosc' WHERE config_name = 'nazwa';


Da się jakoś skonstruować to zapytanie tak, aby XX takich rekordów zaktualizować za jednym zamachem?
bastard13
Jeśli chcesz wszystkie to:
  1. UPDATE `config` SET config_value = 'wartosc';

a wybrane:
  1. UPDATE `config` SET config_value = 'wartosc' WHERE config_name IN ('n1', 'n2', 'n3');
Majkelo23
A jeśli chcę pojedyncze rekordy zmieniać w pojedynczych polach? To zapytanie ma wyglądać tak:

  1. UPDATE `config` SET config_value IN ('wartosc', 'wartosc2', 'wartosc') WHERE config_name IN ('n1', 'n2', 'n3');


questionmark.gif
bostaf
Cytat(Majkelo23 @ 22.05.2012, 07:56:22 ) *
A jeśli chcę pojedyncze rekordy zmieniać w pojedynczych polach? To zapytanie ma wyglądać tak:

  1. UPDATE `config` SET config_value IN ('wartosc', 'wartosc2', 'wartosc') WHERE config_name IN ('n1', 'n2', 'n3');


questionmark.gif

Nie. Klauzuli IN można używać tylko wewnątrz klauzuli WHERE. Wyrażenie SET musi mieć konkretną wartość z dozwolonego zakresu typów wartości.

A odpowiadając na pierwsze pytanie: jeśli wartości są różne dla każdego wpisu to nie da się. Nie da się czystym zapytaniem MySQL. Ale jeśli możesz wykorzystać PHP, to mógłbyś posłużyć się PDO, spreparować zapytanie i wykonać je w pętli dla tablicy wartości:
  1. $dane = array (
  2. 'nazwa1' => 'wartość',
  3. 'nazwa 2' => 'coś innego',
  4. 'n4m3' => 'v4lu3'
  5. );
  6. $stmt = $dbh->prepare("UPDATE `config` SET `config_value` = ? WHERE `config_name` = ?");
  7. foreach($dane as $nazwa => $wartosc) {
  8. $stmt->execute(array($wartosc, $nazwa));
  9. }

Crozin
Cytat
A odpowiadając na pierwsze pytanie: jeśli wartości są różne dla każdego wpisu to nie da się. Nie da się czystym zapytaniem MySQL.
Formalnie rzecz biorąc to jak najbardziej da się, ale nie będzie to za ładne zapytanie, coś w stylu:
  1. UPDATE config SET config_value = CASE config_name WHEN "nazwa1" THEN "nowa wartość 1" WHEN "nazwa2" THEN "nowa wartość 2" WHEN "nazwa3" THEN "nowa wartość 3" END CASE WHERE config_name IN ("nazwa1", "nazwa2", "nazwa3");
Ale taki potworek to koszmar w "utrzymaniu", powinieneś w obrębie jednej transakcji wykonać n zapytań UPDATE, tak jak pokazał to @bostaf.
Majkelo23
Crozin, próbując użyć Twojego zapytania:
  1. UPDATE config SET config_value = CASE config_name WHEN "version" THEN "1.0.1" WHEN "meta" THEN "test" END CASE WHERE config_name IN ("version", "meta");


Otrzymuję błąd:

Cytat
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'CASE WHERE config_name IN ("version", "meta")' at line 1


Co jest nie tak?
Crozin
Powinno być:
  1. [...] SET config_value = (CASE WHEN config_name = "version" THEN ... WHEN config_name = "..." ...) WHERE config_name [...]
Ale naprawdę nie powinieneś wykonywać takiego zapytania - seria n normalnych zapytań to zdecydowanie lepsze rozwiązanie w tym przypadku.
Majkelo23
Ale pod względem optymalnym? Czemu niby? Przecież tutaj mam jedno zapytanie, a tak będzie ich ok. 60.
Crozin
1. Ilość zapytań i ich złożoność to dwie zupełnie odmienne sprawy. Mniejsza ilość zapytań nie musi oznaczać wzrostu wydajności.
2. Tutaj domyślam się, że chodzi o aktualizację jakiejś ogólnej konfiguracji strony/fragmentu strony. Zapewne ten kod nie jest wykonywany 20 razy na sekundę, tak więc aspekty wydajności są nieistotne. Natomiast czytelność i prostota kodu jak najbardziej odgrywają tutaj znaczącą rolę.
Majkelo23
Cytat(Crozin @ 22.05.2012, 23:39:08 ) *
2. Tutaj domyślam się, że chodzi o aktualizację jakiejś ogólnej konfiguracji strony/fragmentu strony.


Dokładnie. OK, zrobię jak napisałeś,dzięki wink.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.