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]
nospor
19.02.2020, 12:09:10
Cytat
to poniższe zapytanie nie działa
Nie podales zadnego zapytania tutaj
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ą?
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?
inomi13
19.02.2020, 12:16:37
GROUP_CONCAT(d.domain_end ORDER BY d.domain_end SEPARATOR '<hr>') AS domain_ends
nospor
19.02.2020, 12:53:30
No juz zapytanie jest zbedne jak dostales od nas wyjasnienie co jest zle.
inomi13
20.02.2020, 08:48:32
Czy jest jakiś inny sposób na porównywanie rekordów przy użyciu GROUP_CONCAT ?
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.
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
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?
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.
"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
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.
nospor
21.02.2020, 12:09:21
@trueblue juz mu to pisalem w tym temacie
http://forum.php.pl/index.php?showtopic=26...p;#entry1248952Ale 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
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.
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
inomi13
21.02.2020, 13:22:42
Tak wszystkie daty
nospor
21.02.2020, 14:50:43
No to wrzucasz to w petle i jedziesz
$oneYearOn3 = date('Y-m-d'); $ok = true;
foreach ($twojaTablica as $end) {
if (($end>=$oneYearOn2)) {
$ok = false;
}
}
if ($ok)
{
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>'; }
edit: czekaj, nie zwrocilem na zawartosc tego co potem w IF masz.
To wiec raczej powinno wygladac tak
$oneYearOn3 = date('Y-m-d'); foreach ($twojaTablica as $end) {
if (($end<$oneYearOn2))
{
echo '<td class="box_small_red" data-column="Ważność domeny"><div class="box_admin">'.$end.'</div></td>'; }
else
{
echo '<td class="box_small_green" data-column="Ważność domeny"><div class="box_admin">'.$end.'</div></td>'; }
}
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
if ($ok)
wyświetlało tylko dany rekord który spełnia ten wymóg a nie wszystkie daty.
nospor
21.02.2020, 14:53:21
zobacz moja edycje z poprzednieg posta
inomi13
21.02.2020, 15:00:30
$oneYearOn3 = date('Y-m-d');
foreach ($twojaTablica AS $end) {
IF (($end<$oneYearOn2))
{
echo '<td class="box_small_red" data-column="Ważność domeny"><div class="box_admin">'.$end.'</div></td>';
}
else
{
echo '<td class="box_small_green" data-column="Ważność domeny"><div class="box_admin">'.$end.'</div></td>';
}
}
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
21.02.2020, 15:02:23
No nie. Kod po edycji ma warunek i wyswietlanie dla kazdej daty oddzielnie
inomi13
21.02.2020, 15:10:51
Poniżej przesyłam kod
<?php
if (!isset($_SESSION['logged'])) {
header('Location: index.php'); }
else
{
if ($_SESSION['user']=='admin')
{
require_once "connect.php";
$connect = @new mysqli($host, $db_user, $db_password, $db_name);
$result = $connect->query("Select p.name,
(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,
GROUP_CONCAT(d.domain_price+d.staff+d.serwer+d.positioning+d.media order by d.domain_end SEPARATOR ' zł <hr>') as domain_prices,
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
from persons p left join domains d on p.id=d.id_person WHERE p.id != 1 group by p.id");
}
else
{
header('Location: panel.php'); }}
?>
<!DOCTYPE HTML>
<html lang="pl">
<head>
</head>
<body id="admin">
<div class="header">
</div>
<div class="content">
<section class="jumpers">
<div class="row">
<table>
<thead>
</thead>
<tbody>
<?php
if($result->num_rows > 0)
{
while($row = $result->fetch_assoc())
{
?>
<tr class="admin">
<?php
$oneYearOn3 = date('Y-m-d');
$pieces3= explode(',',$row["domain_ends"]);
$oneYearOn3 = date('Y-m-d'); foreach ($pieces3 as $end) {
if (($end<$oneYearOn3))
{
echo '<td class="box_small_red" data-column="Ważność domeny"><div class="box_admin">'.$end.'</div></td>'; }
else
{
echo '<td class="box_small_green" data-column="Ważność domeny"><div class="box_admin"><font color=red>'.$end.'</font></div></td>'; }
}
?>
</tr>
<?php
}}
?>
</tbody></table></div>
</div></section></div>
</body>
</html>
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
inomi13
21.02.2020, 15:17:14
faktycznie przeoczyłem zapytanie sql, poprawiłem zapytanie i teraz wszystko działa
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
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.