Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: wybór określonych rekordów z bazy
Forum PHP.pl > Forum > PHP
shreker
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
trueblue
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)?
shreker
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".
trueblue
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
shreker
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ę.
trueblue
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:)
shreker
Nie powiedziałem tak, po prostu zastanawiam się.
trueblue
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.
shreker
dzięki smile.gif
Pyton_000
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
trueblue
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".
Pyton_000
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
sabat24
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);
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.