Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> GROUP BY zmienna z replace ostatniej literki - jak?
Dopler
post 21.10.2011, 14:59:06
Post #1





Grupa: Zarejestrowani
Postów: 81
Pomógł: 0
Dołączył: 30.01.2008

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


problem zapewne banalny, jednak pomimo kilku podobnych wątków żaden nie wyjaśnia mojego problemu:

Jak napisać SELECT aby robił GROUP BY [nazwisko z zamienioną ostatnią literką na i jeśli na końcu jest a]

Wyjaśniam:

Mam prostą bazę osób (nazwisko i imię). Na stronie wybieram literkę z listy i dostaję listę nazwisk rozpoczynających się na daną literę. Wyniki są pogrupowane - tzn jak jest Kowalski Adam i Piotr otrzymuje jeden link "Kowalski" (po jego kliknięciu otrzymuję listę osób z tego nazwiska). To jest proste - GROUP BY a potem funkcja wyszukiwania wg nazwiska.

Potrzebuję jednak zmodyfikować tak to pierwsze wyszukiwanie, aby grupowało także nazwiska kobiece i męskie (tzn te z końcówką na -i oraz -a). Czyli otrzymywać jeden link "Kowalski" - tak aby po jego kliknięciu wychodziła lista i kobiet i mężczyzn.

Nie mogę tego zrobić jednak przez absolutne obcięcie jednej litery bo jeśli nazwiska są np. Baka i Bako - to muszą być osobne linki.

Na stronie mam dwie funkcje - jedna do wyszukania wg litery, druga wg nazwiska. Ta druga działa po kliknięciu w link. Potrzebuję tej pierwszej.



--------------------
Genealogia Polaków
Go to the top of the page
+Quote Post
Sephirus
post 21.10.2011, 15:19:38
Post #2





Grupa: Zarejestrowani
Postów: 1 527
Pomógł: 438
Dołączył: 28.06.2011
Skąd: Warszawa

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


Ok to jest średnia sprawa.

Tu masz przyklad:

  1. SELECT
  2. (CASE SUBSTRING(`nazwisko`,LENGTH(`nazwisko`),1)
  3. WHEN 'a' THEN CONCAT(SUBSTRING(`nazwisko`,1,LENGTH(`nazwisko`)-1),'i')
  4. ELSE `nazwisko`END) AS `nazwisko_po_zmianie`
  5. FROM `nazwa_tabeli`
  6. GROUP BY `nazwisko_po_zmianie`


Musisz tylko dorzucić to co tam jeszcze masz w zapytaniu wink.gif


--------------------
If you're good at something, never do it for free.
Potrzebujesz skryptu JS lub PHP - szukasz kogoś kto przetestuje twoją aplikację pod względem bezpieczeństwa? Szybko i solidnie? Napisz ;)
Mój blog - Jak zwiększyć wydajność front-endu - O buforowaniu wyjścia w PHP słów kilka...
Go to the top of the page
+Quote Post
Dopler
post 22.10.2011, 22:34:30
Post #3





Grupa: Zarejestrowani
Postów: 81
Pomógł: 0
Dołączył: 30.01.2008

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


Dziękuję bardzo - zbyt wysoka filozofia na mój brak doświadczenia. Ale udało się. Jest tylko jeden mały problem
Wyniki wyświetlają się zarówno jako "Kowalska" jak i "Kowalski" Czyli jakby dwukrotnie.

Mój kod obecny to:

Kod
        $getWord=mysql_query("SELECT
    (CASE SUBSTRING(`nazwisko`,LENGTH(`nazwisko`),2) WHEN 'ka' THEN CONCAT(SUBSTRING(`nazwisko`,2,LENGTH(`nazwisko`)-2),'ki') ELSE `nazwisko`END) AS `nazwisko_po_zmianie`
    FROM `fnt`
    WHERE `nazwisko` LIKE '$letter%'
    GROUP BY `nazwisko_po_zmianie`", $db);


if($getWordArray=mysql_fetch_array($getWord))
    {

    do
        {
        if ($string[strlen($getWord)-1]='i')
            {
            echo "<br><a href=\"index.php?nazwisko=";
            printf(substr($getWordArray["nazwisko_po_zmianie"], 0, -1));
            echo "\">";
            printf($getWordArray["nazwisko_po_zmianie"]);
            echo "</a>";
        
    
            }
        else
            {
            echo "<br><a href=\"index.php?nazwisko=";
            printf($getWordArray["nazwisko_po_zmianie"]);
            echo "\">";
            printf($getWordArray["nazwisko_po_zmianie"]);
            echo "</a>";
            }
        
        }
    while($getWordArray=mysql_fetch_array($getWord));

    
}


--------------------
Genealogia Polaków
Go to the top of the page
+Quote Post
Sephirus
post 24.10.2011, 07:59:14
Post #4





Grupa: Zarejestrowani
Postów: 1 527
Pomógł: 438
Dołączył: 28.06.2011
Skąd: Warszawa

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


Proponuje DISTINCT:

  1. $getWord=mysql_query("SELECT
  2. DISTINCT (CASE SUBSTRING(`nazwisko`,LENGTH(`nazwisko`),2) WHEN 'ka' THEN CONCAT(SUBSTRING(`nazwisko`,2,LENGTH(`nazwisko`)-2),'ki') ELSE `nazwisko`END) AS `nazwisko_po_zmianie`
  3. FROM `fnt`
  4. WHERE `nazwisko` LIKE '$letter%'
  5. GROUP BY `nazwisko_po_zmianie`", $db);


--------------------
If you're good at something, never do it for free.
Potrzebujesz skryptu JS lub PHP - szukasz kogoś kto przetestuje twoją aplikację pod względem bezpieczeństwa? Szybko i solidnie? Napisz ;)
Mój blog - Jak zwiększyć wydajność front-endu - O buforowaniu wyjścia w PHP słów kilka...
Go to the top of the page
+Quote Post
Dopler
post 28.10.2011, 07:44:12
Post #5





Grupa: Zarejestrowani
Postów: 81
Pomógł: 0
Dołączył: 30.01.2008

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


Dzięki - właśnie siedziałem nad tym pół nocy i stwierdziłem że błąd jest w składni obliczania - która jest różna w poleceniach MySQL i PHP. Jeśli się prawidłowo to zrobi to zadziała i nie potrzeba DISTINCT
Trzeba było także użyć polecenia CHAR_LEGTH aby znieczulić na polskie literki.
oto rezultat (mam nadzieje że prawidłowy i nie powoduje jakiś skutków ubocznych):

Kod
    $getWord=mysql_query("SELECT
    (CASE SUBSTRING(`nazwisko`, -2, 2) WHEN 'ka' THEN CONCAT(SUBSTRING(`nazwisko` FROM 1 FOR CHAR_LENGTH(nazwisko)-2), 'ki') ELSE `nazwisko` END) AS `nazwisko_po_zmianie`
    FROM `fnt`
    WHERE `nazwisko` LIKE '$letter%'
    GROUP BY `nazwisko_po_zmianie`", $db);


przepraszam za post pod postem - ale jest jeszcze jedno pytanie nie mogę sobie poradzić zeskładnią czy da sięŁ zrobić żeby rozsezryć ten warunek wyszukiwania na dwa przypadki
-cka
-ska

czyli zamiast wyszukiwania po 2 literkach "ka" na końcu wyszukiwało dwa zestawy po 3 i odpowiednio zamieniało na -cki lub -ski

chodzi o to, że sama końcówka -ka nie zawsze oznacza nazwisko żeńskie np. "Zielonka"


--------------------
Genealogia Polaków
Go to the top of the page
+Quote Post
Sephirus
post 28.10.2011, 08:00:18
Post #6





Grupa: Zarejestrowani
Postów: 1 527
Pomógł: 438
Dołączył: 28.06.2011
Skąd: Warszawa

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


Ok zaraz pokombinuje wink.gif

  1. $getWord=mysql_query("
  2. SELECT
  3. (CASE SUBSTRING(`nazwisko`, -3, 3)
  4. WHEN 'ska' THEN CONCAT(SUBSTRING(`nazwisko` FROM 1 FOR CHAR_LENGTH(nazwisko)-3), 'ski')
  5. ELSE (CASE SUBSTRING(`nazwisko`, -3, 3)
  6. WHEN 'cka' THEN CONCAT(SUBSTRING(`nazwisko` FROM 1 FOR CHAR_LENGTH(nazwisko)-3), 'cki')
  7. ELSE `nazwisko`
  8. END)
  9. END) AS `nazwisko_po_zmianie`
  10. FROM `fnt`
  11. WHERE `nazwisko` LIKE '$letter%'
  12. GROUP BY `nazwisko_po_zmianie`
  13. ", $db);


jeśli się nei pomyliłem to powinno chodzić

Ten post edytował Sephirus 28.10.2011, 08:05:56


--------------------
If you're good at something, never do it for free.
Potrzebujesz skryptu JS lub PHP - szukasz kogoś kto przetestuje twoją aplikację pod względem bezpieczeństwa? Szybko i solidnie? Napisz ;)
Mój blog - Jak zwiększyć wydajność front-endu - O buforowaniu wyjścia w PHP słów kilka...
Go to the top of the page
+Quote Post
Dopler
post 28.10.2011, 10:07:18
Post #7





Grupa: Zarejestrowani
Postów: 81
Pomógł: 0
Dołączył: 30.01.2008

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


Działa thx !


--------------------
Genealogia Polakó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: 13.06.2025 - 00:30