Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> wybór określonych rekordów z bazy
shreker
post 18.08.2017, 17:19:40
Post #1





Grupa: Zarejestrowani
Postów: 270
Pomógł: 0
Dołączył: 21.05.2008

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


Witam. Potrzebuję z bazy danych z tabeli "imie" wybrać określone rekordy spełniające określone kryterium: imie ma mieć 7 znaków, oraz zawierać pojedyncze ale niepowtarzające się samogłoski.
Struktura tabeli: id, imie, ilosc.
Z ilością znaków nie ma problemu, ale z resztą nie wiem jak to ugryźć.

  1. SELECT * FROM imie WHERE ilosc='7' ORDER BY id


Ten post edytował shreker 18.08.2017, 17:26:49
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 12)
trueblue
post 18.08.2017, 17:24:36
Post #2





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

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


Z długością też nie powinieneś mieć problemu. Poszperaj w sekcji dotyczącej funkcji na stringach. Taka funkcja musi uwzględniać fakt istnienia polskich znaków.

Drugie kryterium dotyczy tylko i wyłącznie jednej samogłoski w wyrazie, czy może wystąpić również inna (np. a, o, e)?


--------------------
Go to the top of the page
+Quote Post
shreker
post 18.08.2017, 17:29:34
Post #3





Grupa: Zarejestrowani
Postów: 270
Pomógł: 0
Dołączył: 21.05.2008

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


z długością problem jest rozwiązany (sorry dałem po prostu złą cyfrę). Natomiast o samogłoski chodzi o to że mogą występować w dowolnej ilości ale niepowtarzające się, czyli np. nie może dwa razy występować "a".
Go to the top of the page
+Quote Post
trueblue
post 18.08.2017, 19:26:55
Post #4





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

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


Takie coś mi przyszło do głowy:

  1. SELECT imie
  2. FROM imiona
  3. WHERE CHAR_LENGTH(imie)<=7 AND
  4. NOT(LOCATE('a',LEFT(LOWER(imie), LOCATE('a', LOWER(imie))))>0 AND LOCATE('a', MID(LOWER(imie), LOCATE('a', LOWER(imie))+1,7))>0) AND
  5. NOT(LOCATE('e',LEFT(LOWER(imie), LOCATE('e', LOWER(imie))))>0 AND LOCATE('e', MID(LOWER(imie), LOCATE('e', LOWER(imie))+1,7))>0) AND
  6. NOT(LOCATE('i',LEFT(LOWER(imie), LOCATE('i', LOWER(imie))))>0 AND LOCATE('i', MID(LOWER(imie), LOCATE('i', LOWER(imie))+1,7))>0) AND
  7. NOT(LOCATE('o',LEFT(LOWER(imie), LOCATE('o', LOWER(imie))))>0 AND LOCATE('o', MID(LOWER(imie), LOCATE('o', LOWER(imie))+1,7))>0) AND
  8. NOT(LOCATE('u',LEFT(LOWER(imie), LOCATE('u', LOWER(imie))))>0 AND LOCATE('u', MID(LOWER(imie), LOCATE('u', LOWER(imie))+1,7))>0) AND
  9. NOT(LOCATE('y',LEFT(LOWER(imie), LOCATE('y', LOWER(imie))))>0 AND LOCATE('y', MID(LOWER(imie), LOCATE('y', LOWER(imie))+1,7))>0)


Szukamy danej samogłoski, dzielimy wyraz na dwie części w miejscu jej wystąpienia i sprawdzamy, która z nich zawiera daną samogłoskę. Odrzucamy jeśli obydwie części zawierają daną samogłoskę.

Np.:
Cze(e=1) sław(e=0) OK, Czesła(a=1) w(a=0) OK, całość OK
A(a=1) delajda(a=1) NIE OK, Ade(e=1) lajda(e=0) OK, całość NIE OK

Ten post edytował trueblue 18.08.2017, 19:36:23


--------------------
Go to the top of the page
+Quote Post
shreker
post 18.08.2017, 19:40:41
Post #5





Grupa: Zarejestrowani
Postów: 270
Pomógł: 0
Dołączył: 21.05.2008

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


fajne trueblue, mogło by tak być, tylko zastanawiam się, czy nie da się tego zrobić przy użyciu np tablicy. To znaczy wybieram zapytaniem całość do tablicy, tam wyrzucam najpierw z tablicy wszystkie które nie spełniają wymagań co do długości (to akurat proste), a później (tylko nie wiem jeszcze jak), sprawdzam resztę.
Go to the top of the page
+Quote Post
trueblue
post 18.08.2017, 19:44:42
Post #6





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

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


Naprawdę uważasz, że wrzucenie wstępnie odfiltrowanych danych do osobnej tablicy i potem kolejne zapytanie (jeszcze nie wiadomo jakie) na tych nowych danych będzie optymalniejsze? No, to powiedzenia:)


--------------------
Go to the top of the page
+Quote Post
shreker
post 18.08.2017, 19:49:23
Post #7





Grupa: Zarejestrowani
Postów: 270
Pomógł: 0
Dołączył: 21.05.2008

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


Nie powiedziałem tak, po prostu zastanawiam się.
Go to the top of the page
+Quote Post
trueblue
post 18.08.2017, 19:52:12
Post #8





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

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


Jeśli znajdziesz optymalniejszy sposób dla drugiego kryterium, to nie zmieni to faktu, że tworzenie dodatkowej tabeli i filtrowanie etapami, nie ma sensu - nadal wystarczy jedno zapytanie.


--------------------
Go to the top of the page
+Quote Post
shreker
post 18.08.2017, 19:58:13
Post #9





Grupa: Zarejestrowani
Postów: 270
Pomógł: 0
Dołączył: 21.05.2008

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


dzięki smile.gif
Go to the top of the page
+Quote Post
Pyton_000
post 18.08.2017, 20:06:37
Post #10





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

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


Wyciągnij sobie wszystkie 7-literowe do tablicy,
Potem wywalasz wszystko co nie jest samogłoską, robisz count i jeśli jest jakas litera > 1 wywlasz wyraz.

Czasami nie ma co kombinowac w BD bo łatwiej to oprogramować niż tworzyć potworki sql smile.gif
Go to the top of the page
+Quote Post
trueblue
post 18.08.2017, 20:13:09
Post #11





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

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


Tablica w PHP? Aaa, tak ok.

Po wywaleniu spółgłosek zrobiłbym jednak tak: rozkleić string na litery, posortować, skleić i porównać z "aeiouy".


--------------------
Go to the top of the page
+Quote Post
Pyton_000
post 18.08.2017, 20:26:07
Post #12





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

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


Tak też można smile.gif W sumie wydajniej niż to co powiedziałem. Próbwałem jakiegoś reg_exp sklecić na wyszukiwanie duplikatu liter ale jakoś dziś nie wychodzi smile.gif
Go to the top of the page
+Quote Post
sabat24
post 18.08.2017, 22:12:36
Post #13





Grupa: Zarejestrowani
Postów: 175
Pomógł: 26
Dołączył: 13.09.2007
Skąd: Gdańsk

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


Kod
\b\w*(\w)\w*?\1\w*


To powinno zaznaczyć wyrazy z duplikatem znaków. Zapewne jakby ograniczyć baze poszukiwań wyłącznie do samogłosek, to by też zadzialało.

Kod
\b\w*([eyuiao])\w*?\1\w*


To powinno zadziałać tylko dla powtórzonych samogłosek.

A jak już masz tablicę wyrazów o określonej długości, to ta funkcja powinna załatwić sprawę (nie testowałem, ale na oko zadziała - kwestia wstaweinia dobrego regexa do składni preg_grep)

  1. $tablica_bez_powtorzen_samoglosek = preg_grep('/\b\w*([eyuiao])\w*?\1\w*/', $twoja_tablica, PREG_GREP_INVERT);


Ten post edytował sabat24 18.08.2017, 22:40:33
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: 24.07.2025 - 21:45