Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: W SELECT LIMIT działa inaczej niż UPDATE
Forum PHP.pl > Forum > Bazy danych
kkkozak
Witam wszystkich serdecznie, mam nadzieję, że nakierujecie mnie na odpowiedź.
Mamy następujący wynik zapytania:
  1. SELECT * FROM `jakas_tabela` LIMIT 4,1

W tej jednej linijce chciałbym zmienić jakiś rekord.
Jak to zrobić?
markonix
Nie masz wyniku, masz zapytanie, a wyniku nikt nie widzi.

Jak chcesz coś zmieniać to od tego jego UPDATE - nic więcej z Twojego postu nie zrozumiałem.
kkkozak
Przepraszam, jeżeli nie jasno napisałem, chciałbym uaktualnić rekord w czwartej linii tego zapytania.

Nie mogę napisać:
  1. UPDATE `jakas_tabela` SET `jakiś_rekord` = 'zmienione_dane' LIMIT 4,1

gdyż przy UPDATE, LIMIT może mieć tylko jeden parametr.
404
Kod
UPDATE  `jakas_tabela` SET  `jakiś_rekord` =  'zmienione_dane' WHERE `jakiś_rekord_id` = 69
kkkozak
Nie mam dojścia do: 'jakiś_rekord_id'
Do funkcji wpadają mi tylko zmienne
1) $login
2) $nrlinii

Dane:
id Login, Zwierzątko, czy głaskał
1 Maciej, Kotek, false;
2 Maciej, Krowa, false;
3 Adrian, piesek, false;
4 Maciej, piesek, false;

  1. funkcja narysuj_jakie_ma_zwierzatka_uzytkownik($login = Maciej)
  2. ...
  3. SELECT * FROM `jakas_tabela` WHERE Login=$login
  4. ...

Wynik:
1 Maciej, Kotek, false;
2 Maciej, Krowa, false;
4 Maciej, piesek, false;

Użytkownik wybiera trzecią opcje, głaska pieska

funkcja zaznacz_kogo_głaskał_użytkownik($login=Maciej,$nrlinii=3)

No i tutaj chciałbym zmienić ostatni rekord linii:
4 Maciej, piesek, false;
na
true;



kristaps
  1. UPDATE `jakas_tabela` SET `czy głaskał` = 'true' WHERE `id` = 4


poza tym zamiast trzymać true/false, lapiej zrobić to na statusach: 0/1.
kkkozak
Kristaps napisałeś, żeby trzymać to na statusach, ale tak na prawdę tam w tych danych nie ma prawdy i fałszu tylko inne dane, nie podawałem ich by nie komplikować przykładu.

W tym przypadku do funkcji wchodzi mi liczba 3, a nie 4 tak jak u Ciebie Kristaps, gdyż poprzednia funkcja narysowała trzy linijki, co jest prawidłowym działaniem. Dla podkreślenia tego zaznaczyłem trójkę na czerwono.

Próbowałem to zrobić tak:
  1. funkcja zaznacz_kogo_głaskał_użytkownik($login=Maciej,$nrlinii=3)
  2. ...
  3. "UPDATE (SELECT czy_glaskal FROM `jakas_tabela`WHERE login=$login LIMIT $nrlinii,1) AS w SET w='true'";//Tu probowalem zrobic z tego osobna tabele o pojedynczej linii
  4. ...


Wypisało mi następujący błąd:
The target table w of the UPDATE is not updatable

No to spróbowałem tak:
  1. pobierz, plaintext
  2. funkcja zaznacz_kogo_głaskał_użytkownik($login=Maciej,$nrlinii=3)
  3. ...
  4. $query = "UPDATE jakas_tabela AS jt set jt.czy_glaskal = 'true' IN (SELECT czy_glaskal FROM `jakas_tabela`WHERE login=$login LIMIT $nrlinii,1)";//Tu w sumie to nie jestem pewny co chciałem zrobić
  5. ...


Wypisało mi następujący błąd:
This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'


Mógłbym odczytać ID i wtedy na jego podstawie uaktualnić dane, ale wtedy cały mechanizm się spowolni.
Nie chcę by było tak
1)Odczyt ID z bazy
2)Zapis na podstawie ID do bazy
Było by to w dwóch krokach

Chciałbym, aby na podstawie dwóch danych czyli loginu i numeru kolejności wpisanego zwierzęcia
1)uaktualnił mi dane.
Było by to w jednym kroku.

kilkanaście godzin później
Pewnie można to zapytanie zrobić prościej, ale ja zrobiłem to następująco:

  1. funkcja zaznacz_kogo_głaskał_użytkownik($login=Maciej,$nrlinii=3)
  2. ...
  3. $query ="
  4. UPDATE jakaś_tabela SET Czy_głaskał=true
  5. WHERE id IN (
  6. SELECT id FROM (
  7. SELECT id FROM jakaś_tabela
  8. WHERE login=$login
  9. LIMIT $nrlinii,1
  10. ) temp
  11. )"
  12. ...

Dziękuję za pomoc, jeżeli ktoś potrafi zrobić to zapytanie prościej, to z chęcią bym się temu przyjrzał.
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.