Drukowana wersja tematu

Kliknij tu, aby zobaczyć temat w orginalnym formacie

Forum PHP.pl _ Przedszkole _ [PHP]GROUP_CONCAT a warunek dla rekordu

Napisany przez: inomi13 19.02.2020, 12:06:06

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]


Napisany przez: nospor 19.02.2020, 12:09:10

Cytat
to poniższe zapytanie nie działa
Nie podales zadnego zapytania tutaj

Napisany przez: trueblue 19.02.2020, 12:10:10

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ą?

Napisany przez: nospor 19.02.2020, 12:10:38

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?

Napisany przez: inomi13 19.02.2020, 12:16:37

  1. GROUP_CONCAT(d.domain_end ORDER BY d.domain_end SEPARATOR '<hr>') AS domain_ends

Napisany przez: nospor 19.02.2020, 12:53:30

No juz zapytanie jest zbedne jak dostales od nas wyjasnienie co jest zle.

Napisany przez: inomi13 20.02.2020, 08:48:32

Czy jest jakiś inny sposób na porównywanie rekordów przy użyciu GROUP_CONCAT ?

Napisany przez: trueblue 20.02.2020, 09:24:18

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.

Napisany przez: inomi13 21.02.2020, 11:01:46

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

Napisany przez: trueblue 21.02.2020, 11:14:08

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?

Napisany przez: inomi13 21.02.2020, 11:24:07

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");

Napisany przez: trueblue 21.02.2020, 12:01:25

Bo grupujesz po p.id. Tak działa zapytanie.
Zamiast grupować w zapytaniu, wyciągnij normalnie rekordy i pogrupuj je w PHP.

Napisany przez: nospor 21.02.2020, 12:09:21

@trueblue juz mu to pisalem w tym temacie
http://forum.php.pl/index.php?showtopic=267449&st=0&p=1248952&#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

Napisany przez: inomi13 21.02.2020, 13:12:04

Próbowałem przy użyciu explode, jednak utknąłem w miejscu ponieważ nie wiem jak dalej zrobić warunek aby sprawdzał poszczególny rekord.

Napisany przez: nospor 21.02.2020, 13:18:47

Nie odpowiedziales na zadane wczesniej pytanie:
czy wszystkie daty maja spelniac warunek czy tylko jedna. To bardzo istotne pytanie

Napisany przez: inomi13 21.02.2020, 13:22:42

Tak wszystkie daty

Napisany przez: nospor 21.02.2020, 14:50:43

No to wrzucasz to w petle i jedziesz

  1. $oneYearOn3 = http://www.php.net/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. http://www.php.net/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. http://www.php.net/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 = http://www.php.net/date('Y-m-d');
  2. foreach ($twojaTablica as $end) {
  3. if (($end<$oneYearOn2))
  4. {
  5. http://www.php.net/echo '<td class="box_small_red" data-column="Ważność domeny"><div class="box_admin">'.$end.'</div></td>';
  6. }
  7. else
  8. {
  9. http://www.php.net/echo '<td class="box_small_green" data-column="Ważność domeny"><div class="box_admin">'.$end.'</div></td>';
  10. }
  11. }

Napisany przez: inomi13 21.02.2020, 14:51:59

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.

Napisany przez: nospor 21.02.2020, 14:53:21

zobacz moja edycje z poprzednieg posta

Napisany przez: inomi13 21.02.2020, 15:00:30

  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.

Napisany przez: nospor 21.02.2020, 15:02:23

No nie. Kod po edycji ma warunek i wyswietlanie dla kazdej daty oddzielnie

Napisany przez: inomi13 21.02.2020, 15:10:51

Poniżej przesyłam kod

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


Napisany przez: nospor 21.02.2020, 15:15:41

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

Napisany przez: inomi13 21.02.2020, 15:17:14

faktycznie przeoczyłem zapytanie sql, poprawiłem zapytanie i teraz wszystko działa smile.gif

Napisany przez: nospor 21.02.2020, 15:19:34

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)