Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Wyciągnięcie zakresu rekordów
Forum PHP.pl > Forum > Bazy danych > MySQL
adiseq
Cześć,

Mam problem z zapytaniem do bazy. Chcę wyciągnąć z tabeli user rekordy których nazwa zaczyna się na literkę z zakresu A-E. Próbowałem na dwa sposoby: LIKE i REGEXP.
Zapytanie LIKE:
  1. SELECT * FROM users WHERE nazwa LIKE '[A-E]%'

Niestety, takie zapytanie nie wyświetla żadnego rekordu.
Przy zapytaniu REGEXP jest trochę lepiej, ale i tak nie wyświetla wszystkich rekordów tak jak powinno :/
Np. przy zapytaniu
  1. SELECT * FROM user WHERE nazwa REGEXP '^[A-Z]'

które powinno wyświetlić wszystkie rekordy, to wyświetla mi 7/9 i nie wiem dlaczego tamte 2 opuszcza. Natomiast zapytanie
  1. SELECT * FROM user WHERE nazwa REGEXP '^A'
powinno wyświetlić wszystkie rekordy gdzie nazwa zaczyna się na A, a wyświetla 3 rekordy na 4 w których nazwa zaczyna się na A.
Wiecie w czym może być problem? Może mieć to coś związanego z typem tabeli? Typ ustawiony mam na varchar(128).

Pozdrawiam,
Adrian
mmmmmmm
Skoro ci wyświetla mniej, to znaczy, że pozostałe nie spełniają warunków. Sorry, za tyle informacji tylko tyle można powiedzieć.
trueblue
Nie masz czasem spacji na początku tych niewybranych ciągów znaków?
adiseq
no właśnie nie... :/ Mam 4 rekordy o nazwach: "ABC" "Abracadabra" "After Party" i "All We Can".
Przy zapytaniu:
  1. SELECT * FROM user WHERE nazwa REGEXP '^[A-E]' ORDER BY nazwa ASC"
wyświetla po kolei: Abracadabra, After Party i All We Can
a jak z zapytania usunę sortowanie czyli:
  1. SELECT * FROM user WHERE nazwa REGEXP '^[A-E]'
wyświetla po kolei: ABC, Abracadabra i After Party
Jak to możliwe? :/
Przy zapytaniu:
  1. SELECT * FROM user WHERE nazwa REGEXP '^[A-E]*'

wyświetla wszystkie 9 rekordów (nawet te zaczynające się na literkę Z)
mmmmmmm
Do do sortowania... Dodaj (a jeśli masz, to wcześniej usuń) indeks na pole nazwa. Nie pomoże, to spróbuj naprawić tabelę.
Co do '^[A-E]*' wyświetla prawidłowo (nawet te zaczynające się na Z). * bowiem oznacza 'zero or more times'
adiseq
Indeks do pola nazwa nic nie daje :/
Co masz na myśli pisząc, spróbuj naprawić tabelę?
trueblue
A mógłbyś pokazać co daje:
  1. SELECT ASCII(nazwa) FROM user

dla niewybieranych rekordów?
adiseq
Cytat(trueblue @ 19.10.2016, 11:35:26 ) *
A mógłbyś pokazać co daje:
  1. SELECT ASCII(nazwa) FROM user

dla niewybieranych rekordów?

Wpisując to zapytanie zwraca mi 9 pustych rekordów, tj. bez danych takich jak adres, miejscowosc, nazwa itd.

a tak w ogóle to mam taki kod na wyświetlanie:
  1. <?php
  2. ini_set("display_errors", 0);
  3. require_once 'dbconnect.php';
  4. $polaczenie = mysqli_connect($host, $user, $password);
  5. mysqli_query($polaczenie, "SET CHARSET utf8");
  6. mysqli_query($polaczenie, "SET NAMES 'utf8' COLLATE 'utf8_polish_ci'");
  7. mysqli_select_db($polaczenie, $database);
  8.  
  9.  
  10.  
  11. $rezultat = mysqli_query($polaczenie, "SELECT ASCII(nazwa) FROM user");
  12. $ile = mysqli_num_rows($rezultat);
  13.  
  14.  
  15. $row = mysqli_fetch_assoc($rezultat);
  16. $nazwa = $row['nazwa'];
  17. $nip = $row['nip'];
  18. $kodp = $row['kodp'];
  19. $miejscowosc = $row['miejscowosc'];
  20. $ulica = $row['ulica'];
  21. $strona = $row['strona'];
  22. $wizyt = $row['wizyt'];
  23.  
  24. ?>
  25.  
  26. <?php
  27. $nr = 0;
  28. while ($row = mysqli_fetch_assoc($rezultat)) {
  29. ?>
  30. <div class="rekord">
  31. <div class="nazwa"><?php echo $row['nazwa']?></div>
  32. <div class="row">
  33. <div class="col-sm-4 text-center"><label>Kod pocztowy:</label> <?php echo $row['kodp']?></div>
  34. <div class="col-sm-4 text-center"><label>Miejscowość:</label> <?php echo $row['miejscowosc']?></div>
  35. <div class="col-sm-4 text-center"><label>Adres:</label> <?php echo $row['ulica']?></div>
  36. </div>
  37. <div class="row">
  38. <div class="col-sm-4 text-center"><label>NIP:</label> <?php echo $row['nip']?></div>
  39. <div class="col-sm-4 text-center"><label>Telefon:</label> <?php echo $row['telefon']?></div>
  40. <div class="col-sm-4 text-center"><label>Strona:</label> <?php echo $row['strona']?></div>
  41. <div class="przycisk">
  42. <a href="<?php echo $row['wizyt']?>"><button class="btn btn-danger btn-lg" type="submit" style="font-size:12px;">Zobacz wizytówkę</button></a>
  43. </div>
  44. </div>
  45. </div>
  46. <?php $nr++; }
  47.  
  48. ?>
trueblue
Chciałbym abyś pokazał wynik tego zapytania bezpośrednio z bazy danych (poprzez PHPMyAdmin czy inne narzędzie).

mysqli_fetch_assoc wywołujesz raz przed pętlą.
adiseq
0
197
70
65
80
65
65
65
70
90

0 jest to konto administratora przy którym nie ma nazwy

o to chodziło?

hmm jak sprawdzam zapytania w phpmyadmin to taki zapis:
  1. SELECT * FROM user WHERE nazwa REGEXP '^[A-E]' ORDER BY nazwa ASC

działa bez zarzutu, dlaczego więc na stronie nie wyświetla wszystkich rekordów? :/
trueblue
A sprawdzałeś co się dzieje po usunięciu nadmiarowego wywołania mysqli_fetch_assoc?
adiseq
Cytat(trueblue @ 19.10.2016, 12:19:40 ) *
A sprawdzałeś co się dzieje po usunięciu nadmiarowego wywołania mysqli_fetch_assoc?

Działa! smile.gif
Zostawiłem wywołanie w pętli while a to pierwsze usunąłem i działa jak powinno smile.gif
Dzięki wielkie bo już od kilku dni nad tym walczę smile.gif
Pozdrawiam,
Adrian

Nie chcę zakładać nowego tematu, ale mam jeszcze problem z wyświetleniem rekordu który zaczyna się na polski znak.
W tabeli kodowanie mam ustawione na utf8_polish_ci

W kodzie mam:
mysqli_query($polaczenie, "SET CHARSET utf8");
mysqli_query($polaczenie, "SET NAMES 'utf8' COLLATE 'utf8_polish_ci'");

Gdzie może być błąd?
trueblue
Gdybyś opisał problem choć dwoma słowami więcej, myślę, że byłoby łatwiej go rozwiązać.
adiseq
Nie wyświetla mi rekordu w którym nazwa zaczyna się na polski znak np. "Łódź"

Nawet po wpisaniu w phpmyadmin zapytania
  1. SELECT * FROM user WHERE nazwa REGEXP '^[A-Z]' ORDER BY nazwa ASC

Nie wyświetliło tego rekordu
trueblue
REGEXP nie za bardzo się do tego nadaje, ale:
  1. SELECT * FROM user WHERE nazwa REGEXP '^([A-Z]|Ł)'

Tylko właściwie po co ten warunek? Dlaczego nie wyświetlasz wszystkich użytkowników?
adiseq
Bo wyświetlanie wyników podzieliłem sobie na 4 zakładki: A-E, F-M, N-T i U-Z
Muszę tylko podopisywać polskie znaki do zapytań.
Jeszcze raz dzięki wielkie smile.gif
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.