Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [MySQL] Dodawanie lub aktualizacja rekordu (optymalizacja)
servs
post 23.10.2011, 09:59:44
Post #1





Grupa: Zarejestrowani
Postów: 235
Pomógł: 0
Dołączył: 18.11.2006
Skąd: gorzów

Ostrzeżenie: (0%)
-----


Witam,

Potrzebuję zrobić zapytanie SQL, które będzie albo dodawać rekordy (jeżeli $search w kolumnie name nie istnieje) lub aktualizować (jeżeli $search w kolumnie name istnieje).
Co prawda mógłby to zrobić schematem
Sprawdzenie istnienia $search w name funkcją SELECT i count (w php) -> if sprawdzający wartość count i wrzucający odpowiednie zapytanie INSERT INTO bądź UPDATE.

Problem polega na tym, że sama instrukcja SELECT bez wskazania konkretnego indeksu wykonuje się zdecydowanie za długo (w tabeli jest ponad 600 tys rekordów).

Myślałem o REPLACE INTO, ale zauważyłem, że albo dodaje nowy, albo zastępuje stary nowymi wartościami. A potrzebuję wykonać dodatkowo polecenie count=count+1, czyli stary count nie może być zastąpiony, ponieważ stale będzie nosił wartość 1, a to ma zliczać.

Jest możliwość rozwiązania tej sprawy jednym zapytaniem?

Pozdrawiam,
Bartek.
Go to the top of the page
+Quote Post
Fifi209
post 23.10.2011, 10:28:07
Post #2





Grupa: Zarejestrowani
Postów: 4 655
Pomógł: 556
Dołączył: 17.03.2009
Skąd: Katowice

Ostrzeżenie: (0%)
-----


Średnio zrozumiałem o co dokładnie chodzi z tym szukaniem, jakbyś tak dokładniej wytłumaczył.

Ja kiedyś miałem podobny problem, chciałem sprawdzić czy istnieje rekord, jeżeli istnieje dodać wartość a jeżeli nie to go dopisać. W tym celu napisałem odpowiednią funkcję w MySQL, którą wywoływałem zapytaniem z potrzebnymi danymi i ona się zajmowała resztą, tym sposobem ograniczyłem liczbę zapytań.


--------------------
Zainteresowania: C#, PHP, JS, SQL, AJAX, XML, C dla AVR
Chętnie pomogę, lecz zanim napiszesz: Wujek Google , Manual PHP
Go to the top of the page
+Quote Post
wookieb
post 23.10.2011, 10:42:13
Post #3





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




Załóż klucz unikalności na pole "search"
  1. INSERT INTO tabela (search, pole_1, pole_2) VALUES ('fraza', 'cos', 'tam')
  2. ON DUPLICATE KEY UPDATE pole_1 = VALUES(pole_1), pole_2 = VALUES(pole_2)


http://dev.mysql.com/doc/refman/5.0/en/ins...-duplicate.html


--------------------
Go to the top of the page
+Quote Post
servs
post 23.10.2011, 10:46:01
Post #4





Grupa: Zarejestrowani
Postów: 235
Pomógł: 0
Dołączył: 18.11.2006
Skąd: gorzów

Ostrzeżenie: (0%)
-----


Dokładnie o coś takiego mi chodzi.
Mam tabelę
Cytat
ID NAME COUNT

I przy wywoływaniu instrukcji, albo dopisuję kolejny rekord z wartością NAME = $search oraz COUNT = 1, natomiast jeżeli istnieje rekord spełniający warunek NAME = $search, towykonywane jest tylko COUNT=COUNT+1.

Jeśli Kolega ma możliwość, będę wdzięczny za podesłanie tej klasy dla podglądu.
Go to the top of the page
+Quote Post
Fifi209
post 23.10.2011, 10:47:36
Post #5





Grupa: Zarejestrowani
Postów: 4 655
Pomógł: 556
Dołączył: 17.03.2009
Skąd: Katowice

Ostrzeżenie: (0%)
-----


Przyznam szczerze, że nie znałem sposobu, który podał wookieb, ale w moim przypadku i tak musiałem wykonywać operacje na 2+ tabelach.


--------------------
Zainteresowania: C#, PHP, JS, SQL, AJAX, XML, C dla AVR
Chętnie pomogę, lecz zanim napiszesz: Wujek Google , Manual PHP
Go to the top of the page
+Quote Post
wookieb
post 23.10.2011, 11:04:40
Post #6





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




  1. INSERT INTO tabela (`id`, `name`, `count`) VALUES (NULL, 'cos', 1)
  2. ON DUPLICATE KEY UPDATE count = count + 1;


--------------------
Go to the top of the page
+Quote Post
servs
post 23.10.2011, 11:39:14
Post #7





Grupa: Zarejestrowani
Postów: 235
Pomógł: 0
Dołączył: 18.11.2006
Skąd: gorzów

Ostrzeżenie: (0%)
-----


@wookieb Działa elegancko! Dzięki! smile.gif
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 26.04.2025 - 03:21