LINUX.ORG.RU

Запрос из 3-х таблиц + вывод - PHP БД

 ,


0

1

Имеется 3 таблицы :

1 таблица:

ID | FIO | zakaz_STU С данными: 1 | ИВАНОВ ИВАН ИВАНОВИЧ | 1 2 | Петров ИВАН ИВАНОВИЧ | 2

2 таблица:

ID | ID_CLIEN | ID_DATE_POS

1 | 1 | 1 2 | 2 | 1 3 | 1 | 3 4 | 1 | 4 5 | 1 | 5

3 таблица:

ID | DATE | OPO_RAS С данными:

1 | 12.01.2018 | 1 2 | 12.01.2018 | 2 3 | 10.01.2018 | 3 4 | 15.01.2018 | 2 5 | 15.01.2018 | 3

Нужно: Вывести таблицу таким видом:

ФИО | 12.01.2018 | 10.01.2018 | 15.01.2018 Иванов | 2 | 2 | 4 Петров | 2 | 0 | 0

В картинке более менее подробно описано. Буду безумно благодарна за помощь. Сама не понимаю как сделать(

https://i.stack.imgur.com/9x24t.png

С stackoverflow послали сюда, на cyberforum не отвечают.

вообще нихера не хотят думать и свои вопросы корректно сформулировать.

farex
()

а ты не думаешь что если на stackoverflow прислали сюда, то имели введу, что там не могут достаточно... какбэ так сказать... послать тебя в Гугл и учиться.

farex
()
Последнее исправление: farex (всего исправлений: 1)

Здравствуйте.

Вашу задачу решить к сожалению невозможно. Как мне кажется. Дело в том, что у вас получаются динамические столбцы (я про даты в столбцах) и придется разворачивать ответ из БД, а сделать это можно средствами PHP. Если я не ошибаюсь, конечно же.

А вот в таком варианте: ФИО | ДАТА | какое-то число

вывести реально и правильно делать как раз именно так. Если такой вариант вам подойдет и дальше вы сами сможете распарсить это дело в PHP - пишите, я напишу SQL запрос.

fman2
()

все просто, из картинки вполне ясно задание, знающие люди давно написали бы примерный sql запрос. Вы же мамкины хагыры, помогайте людям echo 1+2; выводить, сложные задачи решать не ваша учесть. Спасибо за помощь.

anutkasaveleva5
() автор топика

Вывести таблицу таким видом

А если будет миллион дат, в результате должно быть миллион столбцов? Плюньте в рожу тому, кто задал вам эту задачу.

no-such-file ★★★★★
()
Ответ на: комментарий от anutkasaveleva5

сложные задачи решать не ваша учесть

Сложные и рутинные задачи решаются за деньги, а не за «спасибо мальчики, всем чмоки, я побежала сдавать».

Создай тему в разделе Job — www.linux.org.ru/forum/job/, напиши внятное ТЗ и обозначь сумму. Тогда тебе помогут и даже объяснят почему нужно было сделать так, а не иначе.

Ну или есть другой вариант — ждать человека, у которого есть время, терпение и настроение разбираться в этом за спасибо.

sudo cast Spoofing

EXL ★★★★★
()
Последнее исправление: EXL (всего исправлений: 2)

Мне кажется, это тест для определения тупиц, который ты прошла с позитивным результатом - красивое решение тут получить нельзя, по крайней мере с мне знакомыми движками БД. Но чисто из за спортивного интереса:

MariaDB [(none)]> use test;
Database changed
MariaDB [test]> create table t1(ID varchar(32), FIO varchar(32), zakaz_STU varchar(32));
Query OK, 0 rows affected (0.08 sec)

MariaDB [test]> create table t2(ID varchar(32), ID_CLIEN varchar(32), ID_DATE_POS varchar(32));
Query OK, 0 rows affected (0.01 sec)

MariaDB [test]> create table t3(ID varchar(32), DATE varchar(32), OPO_RAS varchar(32));
Query OK, 0 rows affected (0.00 sec)

MariaDB [test]> insert into t1 values(1,'Jon Jona',1),(2,'Pon Pona',2);
Query OK, 2 rows affected (0.01 sec)
Records: 2  Duplicates: 0  Warnings: 0

MariaDB [test]> insert into t2 values(1,1,1),(2,2,1),(3,1,3),(4,1,4),(5,1,5);
Query OK, 5 rows affected (0.00 sec)
Records: 5  Duplicates: 0  Warnings: 0

MariaDB [test]> insert into t3 values(1,'12.01.2018',1),(2,'12.01.2018',2),(3,'10.01.2018',3),(4,'15.01.2018',2),(5,'15.01.2018',3);
Query OK, 5 rows affected (0.01 sec)
Records: 5  Duplicates: 0  Warnings: 0

MariaDB [test]> select mid(t1.FIO, 1, LOCATE(' ', t1.FIO)-1) as 'FIO', 2 * sum(t3.DATE = '12.01.2018') as  '12.01.2018',  2 * sum(t3.DATE = '10.01.2018') as '10.01.2018', 2 * sum(t3.DATE = '15.01.2018') as  '15.01.2018' from t1, t2, t3 where t1.ID=t2.ID_CLIEN and t2.ID_DATE_POS=t3.ID group by 1;
+------+------------+------------+------------+
| FIO  | 12.01.2018 | 10.01.2018 | 15.01.2018 |
+------+------------+------------+------------+
| Jon  |          2 |          2 |          4 |
| Pon  |          2 |          0 |          0 |
+------+------------+------------+------------+
2 rows in set (0.03 sec)

MariaDB [test]>

anonymous
()
Ответ на: комментарий от anonymous

Сам PHP скрипт на скорую руку. Не то, что он тебе сильно поможет, раз уж тебе «запрос нужен».

<?php
$dbh = new PDO('mysql:dbname=test;host=127.0.0.1', '***user***', '***pass***');

$queryDates = 'select distinct DATE from t3';
$sthDates = $dbh->prepare($queryDates);
$sthDates->execute();

$dates = [];
while ($rw = $sthDates->fetch()) {
    $dates[] = $rw['DATE'];
}

$queryFio = 'select distinct FIO from t1';
$sthFio = $dbh->prepare($queryFio);
$sthFio->execute();

$fio = [];
while ($rw = $sthFio->fetch()) {
    $fio[$rw['FIO']] = trim(substr($rw['FIO'], 0, strpos($rw['FIO'], ' ')));
}


$querySums = <<<'EOT'
    select
         t1.FIO,
         t3.DATE,
         2 * count(*) as ct
    from t1, t2, t3
    where
        t1.ID=t2.ID_CLIEN
        and t2.ID_DATE_POS=t3.ID
    group by t1.FIO, t3.DATE
EOT;
$sthSums = $dbh->prepare($querySums);
$sthSums->execute();

$sums = [];
while ($rw = $sthSums->fetch()) {
    $sums[$rw['FIO']][$rw['DATE']] = $rw['ct'];
}

unset($dbh);

$headers = array_merge(['FIO'], $dates);
?>
<!DOCTYPE html>
<html>
    <body>
        <table>
            <thead>
                <tr>
                    <th>
                        <?= implode("</th><th>", array_map('htmlspecialchars', $headers)) ?>
                    </th>
                </tr>
            </thead>
            <tbody>
                <?php foreach ($fio as $fioRaw => $name): ?>
                    <tr>
                        <td>
                            <?= htmlspecialchars($name) ?>
                        </td>
                        <?php foreach ($dates as $date): ?>
                            <td>
                                <?= (int) ($sums[$fioRaw][$date] ?? 0) ?>
                            </td>
                        <?php endforeach; ?>
                    </tr>
                <?php endforeach; ?>
            </tbody>
        </table>
    </body>
</html>
anonymous
()

zakaz_STU CLIEN OPO_RAS

Увидел это и на секунду окунулся в прошлое. delphi, vb, bde...

// пс: пару раз ошибся с капчей дорог и теперь мне их гугл суёт постоянно. Или это просто глобально тема дрог пошла?

anonymous
()
Ответ на: комментарий от anonymous

А вот мне - нигде и не разу, только галочку «I'm not a robot» поставить. :) Похоже, внешний IP на чистый сменился.

anonymous
()
Ответ на: комментарий от anutkasaveleva5

Всё согласно приложенной картинке. По правилам sql, если связать 1 с 2 получается пустая выборка

anonymous
()
Ответ на: комментарий от anonymous

Я уже все переправила, не совсем поняла, зачем обрезать клиента LOCATE(' ', t1.FIO)-1) as 'FIO но тем не менее, остальной код годный. Всем спасибо, тебе в двойне спасибо.

anutkasaveleva5
() автор топика
Ответ на: комментарий от fman2

Я бы казнил за такое...

Ну блин, как задача поставлена, такое и решение. :D Нужен именно запрос? Вот он.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.