Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [MySQL] SELECT WHERE id
Spirit86
post 26.04.2011, 16:40:33
Post #1





Grupa: Zarejestrowani
Postów: 607
Pomógł: 23
Dołączył: 8.09.2004
Skąd: Wrocław

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


Witam
Chcę zrobić coś takiego:

Pobierz z tabeli
SELECT FROM tabela WHERE id=1 ( OR id = 10 ->jeżeli nie ma rekordów o id=1)

Napisałem:
  1. SELECT
  2. t1.naglowki
  3. FROM
  4. (
  5. SELECT
  6. @rownum := @rownum +1 AS rownum, naglowki
  7. FROM xn_layout WHERE id='1'
  8. ORDER BY id ) t1
  9. WHERE
  10. id =
  11. CASE WHEN t1.rownum=0 THEN
  12. '1'
  13. ELSE
  14. '10'
  15. END

Jednak powyższy kod nie zwraca rekordów. Może da się to zrobić jakoś prościej? (nie chce postów typu: zadaj 2 pytania w php)


--------------------
Audio: Metallica, Soil, RHCP, OffSpring, Green Day, "Retro", Gorillaz, Disturbed, Coma
DB: MySQL 4.1 | php: 4.4.3 Pomogłem Ci? Wciśnij przycisk POMÓGŁ.
Go to the top of the page
+Quote Post
pmir13
post 26.04.2011, 17:51:47
Post #2





Grupa: Zarejestrowani
Postów: 282
Pomógł: 89
Dołączył: 12.04.2011

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


  1. SELECT * FROM tabela WHERE id=1 OR id=10 ORDER BY id LIMIT 1


Ten post edytował pmir13 26.04.2011, 17:53:48
Go to the top of the page
+Quote Post
Spirit86
post 26.04.2011, 18:06:47
Post #3





Grupa: Zarejestrowani
Postów: 607
Pomógł: 23
Dołączył: 8.09.2004
Skąd: Wrocław

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


to mi pobierze o id 10 lub id 1 czyli załóżmy 2 rekordy, jeżeli oba istnieją... Chcę jeżeli istnieje rekord o id=10 pobrał JEDEN rekord o id=10, jeżeli nie ma takiego niech pobierze ten o id=1


--------------------
Audio: Metallica, Soil, RHCP, OffSpring, Green Day, "Retro", Gorillaz, Disturbed, Coma
DB: MySQL 4.1 | php: 4.4.3 Pomogłem Ci? Wciśnij przycisk POMÓGŁ.
Go to the top of the page
+Quote Post
nospor
post 26.04.2011, 18:08:02
Post #4





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Przecież masz tam LIMIT 1 - mogłeś sprawdzić to zapytanie w praktyce a nie dyskytować teoretycznie. Z teorią jak widać u Ciebie nie za dobrze (bez urazy) wink.gif
Powód edycji: [nospor]:


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
Spirit86
post 26.04.2011, 18:17:10
Post #5





Grupa: Zarejestrowani
Postów: 607
Pomógł: 23
Dołączył: 8.09.2004
Skąd: Wrocław

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


Cytat(nospor @ 26.04.2011, 18:08:02 ) *
Przecież masz tam LIMIT 1 - mogłeś sprawdzić to zapytanie w praktyce a nie dyskytować teoretycznie. Z teorią jak widać u Ciebie nie za dobrze (bez urazy) wink.gif


To jest ułomne zastosowanie i nie uniwersalne. Gdy mam id nie jest unikatowe i mam np 10 rekordów z id=10 i 8 z id=1. Chce pobrac tylko te z id=10


--------------------
Audio: Metallica, Soil, RHCP, OffSpring, Green Day, "Retro", Gorillaz, Disturbed, Coma
DB: MySQL 4.1 | php: 4.4.3 Pomogłem Ci? Wciśnij przycisk POMÓGŁ.
Go to the top of the page
+Quote Post
nospor
post 26.04.2011, 18:31:09
Post #6





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Cytat
To jest ułomne zastosowanie i nie uniwersalne
Podałęś konkretną sytuację, podano ci najlepsze rozwiązanie dla tej sutyacji. Co w tym ułomnego?

Cytat
Gdy mam id nie jest unikatowe
I teraz dopiero precyzujesz. W świetle nowych faktów podane rozwiązanie faktycznie jest ułomne, Nie można było tak od razu?

W życiu bym nie przypuszczał, że pole o nazwie ID może nie być unikalne... no ale co kraj to obyczaj smile.gif

Tak na szybko:
  1. SET @zm:=10;
  2. SELECT * FROM (
  3. SELECT cc.*,IF(ID=1,@zm:=1,0) FROM TABLE cc WHERE ID = 1 OR ID=10
  4. ) podsel WHERE podsel.ID=@zm


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
pmir13
post 26.04.2011, 18:38:47
Post #7





Grupa: Zarejestrowani
Postów: 282
Pomógł: 89
Dołączył: 12.04.2011

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


  1. SELECT * FROM tabela WHERE id = 10 OR id = 1 AND NOT EXISTS (SELECT id FROM tabela WHERE id=10 )
Go to the top of the page
+Quote Post
nospor
post 26.04.2011, 18:54:00
Post #8





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




@pmir13 masz może jakąś dużą tabelę, gdzie można by czasowo sprawdzić nasz metody? Zastanawiam się nad szybkością obu rozwiązań


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
Spirit86
post 26.04.2011, 18:58:33
Post #9





Grupa: Zarejestrowani
Postów: 607
Pomógł: 23
Dołączył: 8.09.2004
Skąd: Wrocław

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


@pmir13: to rozwiązanie mi się podoba! smile.gif Proste i skuteczne smile.gif.
@nospor: jak bed mial troche czasu to stworze wieksza baze danych i sprawdze obie metody.

pzdr


--------------------
Audio: Metallica, Soil, RHCP, OffSpring, Green Day, "Retro", Gorillaz, Disturbed, Coma
DB: MySQL 4.1 | php: 4.4.3 Pomogłem Ci? Wciśnij przycisk POMÓGŁ.
Go to the top of the page
+Quote Post
pmir13
post 26.04.2011, 20:25:01
Post #10





Grupa: Zarejestrowani
Postów: 282
Pomógł: 89
Dołączył: 12.04.2011

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


Na tabeli film_actor i zewnętrznym kluczu film_id z bazy sakila (darmowa testowa baza mysql do ściągniecia) moje zapytanie wykonuje się u mnie na moim domowym gracie w obu przypadkach 0.0008s zwracając po około 10 rekordów ze wszystkich ponad 5tys. Dla porównania zapytanie typu "SELECT 1" wykonuje się 0.0004s, czyli tylko dwa razy szybciej.
To oczywiście nie jest duża baza, ale po explainie i wykorzystaniu kluczy i ilości porównań widać, że niewiele się zmieni gdy liczba dojdzie do kilku milionów.
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: 19.07.2025 - 09:33