Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]GROUP_CONCAT a warunek dla rekordu
Forum PHP.pl > Forum > Przedszkole
inomi13
Używam GROUP_CONCAT aby połączyć rekordy z dwóch tabel. Ustawiłem poniższy warunek. Jednak w sytuacji kiedy jest więcej niż 1 rekord to poniższe zapytanie nie działa. Proszę o pomoc jak rozwiązać problem.

$oneYearOn3 = date('Y-m-d');
if (($row["domain_ends"]<$oneYearOn2))
{
echo '<td class="box_small_red" data-column="Ważność domeny"><div class="box_admin">'.$row["domain_ends"].'</div></td>';
}
else
{
echo '<td class="box_small_green" data-column="Ważność domeny"><div class="box_admin">'.$row["domain_ends"].'</div></td>';
}
[/php]

nospor
Cytat
to poniższe zapytanie nie działa
Nie podales zadnego zapytania tutaj
trueblue
Więcej niż jeden rekord, który wpada do grupy łączonej poprzez GROUP_CONCAT, tak?
Jak ma więc działać, skoro wynikiem jest kilka dat połączonych w jeden string, a Ty porównujesz całość z datą?
nospor
poza tym, moja szklana kula mowi ze:

twoj warunek wyglada tak
data1,data2<$oneYearOn2

Wiec niby jakim cudem daty oddzielone przecinkiem (czy czym ty je tam laczysz w GROUP_CONCAT) maja byc od czegos mniejsze/wieksze?
inomi13
  1. GROUP_CONCAT(d.domain_end ORDER BY d.domain_end SEPARATOR '<hr>') AS domain_ends
nospor
No juz zapytanie jest zbedne jak dostales od nas wyjasnienie co jest zle.
inomi13
Czy jest jakiś inny sposób na porównywanie rekordów przy użyciu GROUP_CONCAT ?
trueblue
Najpierw musisz odpowiedzieć sobie na pytanie jaką informację chcesz wyświetlić, kiedy jedna data w grupie będzie wygasać, a pozostałe nie (lub odwrotnie).

Możesz albo rozdzielić grupę w PHP i sprawdzać każdą datę z osobna, albo sprawdzić ważność dla grupy (na podstawie warunku j.w.) już w samym zapytaniu.
inomi13
W dużym skrócie posiadam w bazie danych tabele osoby, tabele domeny i tabelę adresy e-mail. Jedna osoba może mieć np. dwie domeny i 6 adresów e-mail przypisanych do danej domeny. W jaki sposób mogę rozdzielić wynik z zapytania GROUP_CONCAT tak abym mógł zrobić konkretne warunki
trueblue
Dla każdej daty z osobna będziesz robił warunek?
Jeśli tak, to po co w ogóle sklejasz daty w jeden ciąg?
inomi13
jeżeli nie nie użyje group_concat dla d.domain_end to wynikiem będzie tylko jeden rekord.

  1.  
  2. "Select p.name, (Select GROUP_CONCAT(e.adres_email SEPARATOR '<hr>') from email e where e.id_person=d.id_person) as adres_email, GROUP_CONCAT(d.domain_end order by d.domain_end SEPARATOR '<hr>') as domain_ends, group_concat(d.domain_name order by d.domain_end SEPARATOR '<hr>') as domain_names from persons p left join domains d on p.id=d.id_person WHERE p.id != 1 group by p.id");
trueblue
Bo grupujesz po p.id. Tak działa zapytanie.
Zamiast grupować w zapytaniu, wyciągnij normalnie rekordy i pogrupuj je w PHP.
nospor
@trueblue juz mu to pisalem w tym temacie
http://forum.php.pl/index.php?showtopic=26...p;#entry1248952

Ale to nie ma znaczenia czy on to grupuje czy nie. Jak grupuje to niech zrobi zwykle EXPLODE i tez bedzie mial tablice. Oba przypadki dadza ten sam efekt: tablice dat. Nie ma znaczenia jak do tego dojdzie
inomi13
Próbowałem przy użyciu explode, jednak utknąłem w miejscu ponieważ nie wiem jak dalej zrobić warunek aby sprawdzał poszczególny rekord.
nospor
Nie odpowiedziales na zadane wczesniej pytanie:
czy wszystkie daty maja spelniac warunek czy tylko jedna. To bardzo istotne pytanie
inomi13
Tak wszystkie daty
nospor
No to wrzucasz to w petle i jedziesz

  1. $oneYearOn3 = date('Y-m-d');
  2. $ok = true;
  3.  
  4. foreach ($twojaTablica as $end) {
  5. if (($end>=$oneYearOn2)) {
  6. $ok = false;
  7. }
  8. }
  9.  
  10. if ($ok)
  11. {
  12. echo '<td class="box_small_red" data-column="Ważność domeny"><div class="box_admin">'.$row["domain_ends"].'</div></td>';
  13. }
  14. else
  15. {
  16. echo '<td class="box_small_green" data-column="Ważność domeny"><div class="box_admin">'.$row["domain_ends"].'</div></td>';
  17. }


edit: czekaj, nie zwrocilem na zawartosc tego co potem w IF masz.
To wiec raczej powinno wygladac tak

  1. $oneYearOn3 = date('Y-m-d');
  2. foreach ($twojaTablica as $end) {
  3. if (($end<$oneYearOn2))
  4. {
  5. echo '<td class="box_small_red" data-column="Ważność domeny"><div class="box_admin">'.$end.'</div></td>';
  6. }
  7. else
  8. {
  9. echo '<td class="box_small_green" data-column="Ważność domeny"><div class="box_admin">'.$end.'</div></td>';
  10. }
  11. }
inomi13
Dziękuje za pomoc kod działa jednak nie do końca tak jak chce, ponieważ mi zalezy na tym
  1. if ($ok)
wyświetlało tylko dany rekord który spełnia ten wymóg a nie wszystkie daty.
nospor
zobacz moja edycje z poprzednieg posta
inomi13
  1. $oneYearOn3 = date('Y-m-d');
  2. foreach ($twojaTablica AS $end) {
  3. IF (($end<$oneYearOn2))
  4. {
  5. echo '<td class="box_small_red" data-column="Ważność domeny"><div class="box_admin">'.$end.'</div></td>';
  6. }
  7. else
  8. {
  9. echo '<td class="box_small_green" data-column="Ważność domeny"><div class="box_admin">'.$end.'</div></td>';
  10. }
  11. }


Twoje zapytanie działa kiedy wszystkie rekordy spełniają warunek. Natomiast ja potrzebuje czegoś innego tzn. jeżeli jedna z dat spełnia warunek to np. zmienia się jej kolor na box czerwony, a reszta dat zmienia kolor zielony.
nospor
No nie. Kod po edycji ma warunek i wyswietlanie dla kazdej daty oddzielnie
inomi13
Poniżej przesyłam kod

  1. <?php
  2.  
  3. if (!isset($_SESSION['logged']))
  4. {
  5. header('Location: index.php');
  6. exit();
  7. }
  8. else
  9. {
  10. if ($_SESSION['user']=='admin')
  11. {
  12. require_once "connect.php";
  13. $connect = @new mysqli($host, $db_user, $db_password, $db_name);
  14. $result = $connect->query("Select p.name,
  15.  
  16. (Select GROUP_CONCAT(e.adres_email order by d.domain_end SEPARATOR '<hr>') from email e where e.id_person=p.id) as adres_email,
  17.  
  18. GROUP_CONCAT(d.domain_price+d.staff+d.serwer+d.positioning+d.media order by d.domain_end SEPARATOR ' zł <hr>') as domain_prices,
  19.  
  20. GROUP_CONCAT(d.domain_end order by d.domain_end SEPARATOR '<br>') as domain_ends, group_concat(d.domain_name order by d.domain_end SEPARATOR '<hr>') as domain_names
  21.  
  22. from persons p left join domains d on p.id=d.id_person WHERE p.id != 1 group by p.id");
  23. }
  24. else
  25. {
  26.  
  27. header('Location: panel.php');
  28. }}
  29. ?>
  30. <!DOCTYPE HTML>
  31. <html lang="pl">
  32. <head>
  33.  
  34. </head>
  35. <body id="admin">
  36. <div class="header">
  37.  
  38. </div>
  39. <div class="content">
  40. <section class="jumpers">
  41. <div class="row">
  42. <table>
  43. <thead>
  44.  
  45. </thead>
  46. <tbody>
  47. <?php
  48. if($result->num_rows > 0)
  49. {
  50. while($row = $result->fetch_assoc())
  51. {
  52. ?>
  53. <tr class="admin">
  54. <?php
  55.  
  56.  
  57. $oneYearOn3 = date('Y-m-d');
  58.  
  59. $oneYearOn= date('Y-m-d', strtotime($row["domain_ends"]));
  60.  
  61. $pieces3= explode(',',$row["domain_ends"]);
  62.  
  63. $oneYearOn3 = date('Y-m-d');
  64. foreach ($pieces3 as $end) {
  65. if (($end<$oneYearOn3))
  66. {
  67. echo '<td class="box_small_red" data-column="Ważność domeny"><div class="box_admin">'.$end.'</div></td>';
  68. }
  69. else
  70. {
  71. echo '<td class="box_small_green" data-column="Ważność domeny"><div class="box_admin"><font color=red>'.$end.'</font></div></td>';
  72. }
  73. }
  74.  
  75. ?>
  76. </tr>
  77. <?php
  78. }}
  79. ?>
  80. </tbody></table></div>
  81. </div></section></div>
  82. </body>
  83. </html>
  84.  

nospor
Masakra jakas....

laczysz DATY przy pomocy <BR> a potem radosnie oddzielasz po PRZECINKU... Nawet nie raczyles spojrzec co ci explode zwraca :/ No szanuj troche czas innych
inomi13
faktycznie przeoczyłem zapytanie sql, poprawiłem zapytanie i teraz wszystko działa smile.gif
nospor
Cytat
faktycznie przeoczyłem zapytanie sql

To co przeoczyles to DEBUGOWANIE. Zawsze sprawdzaj na jakich danych operujesz oraz co ci zwracaja.
glupie print_r czy var_dump cie nie zabije a zaoszczedzi mase czasu tobie i innym nieszczesnikom co probuja ci pomoc
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.