Форум программистов, компьютерный форум, киберфорум
PHP: базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.67/9: Рейтинг темы: голосов - 9, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 01.02.2015
Сообщений: 50

Преобразование выборки к определённому виду

15.03.2017, 20:03. Показов 2010. Ответов 34
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет, ребят!

Как можно добавить в array данные из БД, чтобы все выглядело так:



Есть две таблицы: complaints и complaints_reply. Из таблицы complaints выводятся id, offer_id, text, date. Из таблицы complaints_reply выводятся в "realy" значения reply_name, reply_text, reply_date
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
15.03.2017, 20:03
Ответы с готовыми решениями:

Результат выборки передать GET запросом для изменения условий другой выборки
Есть такая таблица menu: Таким запросом вывожу на страницу: <?php include ("bd.php"); function display_menus($parent = 0) ...

Преобразование строки к URL-виду
Приветствую, ребята! Недавно проскальзовала тема по поводу преобразования строки к виду URL, например: привет мир =...

Преобразование текста к читаемому виду
имеется вот такой текст : 1. An unnamed cell2. putin3. Zzz4. AMG5. An unnamed cell6. China7. КУРЛЫК КУРЛЫК8. liar9. dim4ik10. karamelka ...

34
0 / 0 / 0
Регистрация: 01.02.2015
Сообщений: 50
15.03.2017, 20:15  [ТС]
Я бы сделал так, но тогда, сами понимаете, будут выведены не все значения, а лишь последние.

PHP
1
2
3
4
5
6
7
8
9
10
11
12
        $complaints_arr = array(
                "id" => $complaints_id,
                "offer_id" => $complaints_offer_id,
                "user_name" => "$complaints_user_name",
                "text" => "$complaints_text",
                "date" => $complaints_date,
                "reply" => array(
                    "reply_name" => "$complaints_reply_name",
                    "reply_text" => "$complaints_reply_text",
                    "reply_date" => $complaints_reply_date
                )
            );
0
6 / 6 / 0
Регистрация: 13.05.2012
Сообщений: 593
17.03.2017, 00:28
А что значат символы => ?
0
Эксперт PHP
 Аватар для Kerry_Jr
3106 / 2591 / 1219
Регистрация: 14.05.2014
Сообщений: 7,236
Записей в блоге: 1
17.03.2017, 09:18
Цитата Сообщение от oleg rus Посмотреть сообщение
А что значат символы => ?
Массивы
1
Эксперт PHP
 Аватар для Kerry_Jr
3106 / 2591 / 1219
Регистрация: 14.05.2014
Сообщений: 7,236
Записей в блоге: 1
17.03.2017, 11:39
vladly, по какому полю объединяются эти две таблицы?
0
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
 Аватар для KOPOJI
16844 / 6724 / 880
Регистрация: 12.06.2012
Сообщений: 19,967
17.03.2017, 12:16
Цитата Сообщение от vladly Посмотреть сообщение
чтобы все выглядело так
чтобы все выглядело именно так, используйте json_encode для массива с вашими данными..
0
0 / 0 / 0
Регистрация: 01.02.2015
Сообщений: 50
17.03.2017, 20:53  [ТС]
Ребят, помогите, пожалуйста, решить проблему!

Вывожу данные из бд следующим способом:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
$arr = array();
    $arr2 = array();
    $offers_query = "SELECT * FROM offers WHERE company_id = '2'";
    $offers_result = $mysqli->query($offers_query);
    while($offers_row = $offers_result->fetch_array(MYSQLI_ASSOC)) {
        $offer_id = $offers_row['id'];
        
        $complaints_query = "SELECT * FROM complaints WHERE offer_id = '$offer_id'";
        $complaints_result = $mysqli->query($complaints_query);
        while($complaints_row = $complaints_result->fetch_array(MYSQLI_ASSOC)) {
            $complaint_id = $complaints_row['id'];
            
            array_push($arr, $complaints_row);
            
            $complaints_reply_query = "SELECT * FROM complaints_reply WHERE complaint_id = '$complaint_id'";
            $complaints_reply_result = $mysqli->query($complaints_reply_query);
            while($complaints_reply_row = $complaints_reply_result->fetch_array(MYSQLI_ASSOC)) {
                
                array_push($arr2, $complaints_reply_row);
                
            }
            $arr[0]['reply'] = $arr2;
        }
        
    }
    
    
    echo json_encode($arr, JSON_UNESCAPED_UNICODE);
На выходе получаю это:

JSON
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
[
        {
            "id":"1",
            "offer_id":"1",
            "user_name":"Петр",
            "text":"Некомпетентный сотрудник",
            "date":"12342",
            "reply":[
                {
                    "id":"1",
                    "complaint_id":"1",
                    "reply_name":"Женя",
                    "reply_text":"Разберемся",
                    "reply_date":"23897289"
                },
                {
                    "id":"2",
                    "complaint_id":"1",
                    "reply_name":"Макс",
                    "reply_text":"Это точно",
                    "reply_date":"2676723"
                },
                {
                    "id":"6",
                    "complaint_id":"1",
                    "reply_name":"Дима",
                    "reply_text":"Ответили уже",
                    "reply_date":"23321"
                },
                {
                    "id":"5",
                    "complaint_id":"2",
                    "reply_name":"Стас",
                    "reply_text":"ОКЭ",
                    "reply_date":"23232"
                }
            ]
        },
        {
            "id":"2",
            "offer_id":"2",
            "user_name":"Иван",
            "text":"Ужасный сотрудник!",
            "date":"2324123"
        }
    ]
Почти идеально... НО надо, чтобы было так:

JSON
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
[
        {
            "id":"1",
            "offer_id":"1",
            "user_name":"Петр",
            "text":"Некомпетентный сотрудник",
            "date":"12342",
            "reply":[
                {
                    "id":"1",
                    "complaint_id":"1",
                    "reply_name":"Женя",
                    "reply_text":"Разберемся",
                    "reply_date":"23897289"
                },
                {
                    "id":"2",
                    "complaint_id":"1",
                    "reply_name":"Макс",
                    "reply_text":"Это точно",
                    "reply_date":"2676723"
                },
                {
                    "id":"6",
                    "complaint_id":"1",
                    "reply_name":"Дима",
                    "reply_text":"Ответили уже",
                    "reply_date":"23321"
                }
            ]
        },
        {
            "id":"2",
            "offer_id":"2",
            "user_name":"Иван",
            "text":"Ужасный сотрудник!",
            "date":"2324123",
            "reply":[
                {
                    "id":"5",
                    "complaint_id":"2",
                    "reply_name":"Стас",
                    "reply_text":"ОКЭ",
                    "reply_date":"23232"
                }
            ]
        }
    ]
То есть каждому главному id соответствует свой complaint_id
 Комментарий модератора 
Дублирование тем запрещено


Добавлено через 12 минут
Kerry_Jr, id из таблицы complaints соответствует complaint_id из таблицы complaints_reply. Есть идеи?((
0
Эксперт PHP
 Аватар для Kerry_Jr
3106 / 2591 / 1219
Регистрация: 14.05.2014
Сообщений: 7,236
Записей в блоге: 1
17.03.2017, 20:57
Цитата Сообщение от vladly Посмотреть сообщение
Есть идеи?
Конечно есть. Первая - вытащить все данные одним запросом. Но для этого мне нужно знать структуру все трех таблиц.
0
0 / 0 / 0
Регистрация: 01.02.2015
Сообщений: 50
17.03.2017, 20:59  [ТС]
Kerry_Jr, я не раз пытался (через inner join)... можете помочь правильно составить запрос?
0
Эксперт PHP
 Аватар для Kerry_Jr
3106 / 2591 / 1219
Регистрация: 14.05.2014
Сообщений: 7,236
Записей в блоге: 1
17.03.2017, 21:05
vladly, я написал выше, что мне нужно: структуру таблиц, а ещё лучше - какие столбцы из каких таблиц будут использоваться.
0
0 / 0 / 0
Регистрация: 01.02.2015
Сообщений: 50
17.03.2017, 21:06  [ТС]
Kerry_Jr, Структура таблиц:

offers:
#Имя
1id
2company_id
3category
4subcategory_1lvl
5subcategory_2lvl
6price
7description
8x_coordinate
9y_coordinate
10premium
11views
12phone
13date

complaints:
#Имя
1id
2offer_id
3user_name
4text
5date

complaints_reply:
#Имя
1id
2complaint_id
3reply_name
4reply_text
5reply_date

Я просто не сразу видел Ваш ответ. Из таблицы offers берется id (where company_id = '2' (например)), из таблицы complaints берется все (where offer_id = id из таблицы offers), из таблицы complaints_reply берется все (where complaint_id = id из таблицы complaints).

Надеюсь, понятно!
0
0 / 0 / 0
Регистрация: 01.02.2015
Сообщений: 50
17.03.2017, 21:11  [ТС]
Kerry_Jr, понятна структура и какие нужны строки?
0
Эксперт PHP
 Аватар для Kerry_Jr
3106 / 2591 / 1219
Регистрация: 14.05.2014
Сообщений: 7,236
Записей в блоге: 1
18.03.2017, 12:30
vladly, я пораскинул мозгами и пришёл к выводу, что один запрос будет слишком громоздким и выборка тоже. Сейчас соберу мозги обратно и попробую помочь, если ещё нужно.
1
0 / 0 / 0
Регистрация: 01.02.2015
Сообщений: 50
18.03.2017, 15:32  [ТС]
Kerry_Jr, да, еще очень нужно!

Я делаю так:

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$arr = array();
    $offers_query = "SELECT cm.id AS cmID, cm.offer_id, cm.user_name, cm.text, cm.date FROM complaints cm INNER JOIN offers of ON of.id = cm.offer_id WHERE of.company_id = '2'";
    $offers_result = $mysqli->query($offers_query);
    while($offers_row = $offers_result->fetch_array(MYSQLI_ASSOC)) {
        $offer_cmID = $offers_row['cmID'];
        
        array_push($arr, $offers_row);
            
        $offers_query2 = "SELECT * FROM complaints_reply WHERE complaint_id = '$offer_cmID'";
        $offers_result2 = $mysqli->query($offers_query2);
        while($offers_row2 = $offers_result2->fetch_array(MYSQLI_ASSOC)) {
            
            $arr[] = $offers_row2;
            
        }
    }
    
    echo json_encode($arr, JSON_UNESCAPED_UNICODE);
Тогда выводится все в правильном порядке, но не в том формате, в котором надо.
Я попытался заменить
PHP
1
$arr[] = $offers_row2;
на
PHP
1
$arr[0]['reply'] = $offers_row2;
, тогда выводится в правильном формате, но неправильном порядке! Вообще беда....
0
Эксперт PHP
 Аватар для Kerry_Jr
3106 / 2591 / 1219
Регистрация: 14.05.2014
Сообщений: 7,236
Записей в блоге: 1
18.03.2017, 15:42
vladly, а ну попробуйте
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
$reply_sep = '|><|';
$field_sep = '<||>';
 
$sql = 'SELECT *, `c_r`.`reply` '
        . 'FROM `compliants` '
        . 'INNER JOIN ('
        . 'SELECT `compliants_reply`.`compliant_id`, '
        . 'GROUP_CONCAT(CONCAT_WS("' . $field_sep . '", `id`,`compliant_id`, `reply_name`, `reply_text`, `reply_date`) SEPARATOR "' . $reply_sep . '") `reply`'
        . 'FROM `compliants_reply` GROUP BY `compliant_id`) `c_r` '
        . 'ON `compliants`.`id` = `c_r`.`compliant_id` '
        . 'WHERE `offer_id` IN (SELECT GROUP_CONCAT(`id`) FROM `offers` WHERE `company_id` = 2 GROUP BY `company_id`)';
 
$result = $mysqli->query($sql) or die($mysqli->error);
$arr = [];
$reply = ['id', 'compliant_id', 'reply_name', 'reply_text', 'reply_date'];
while ($row = $result->fetch_assoc()) {
    $temp = array_splice($row, 0, 5);
 
    foreach (explode($reply_sep, $row['reply']) as $item) {
        $temp['reply'][] = array_combine($reply, explode($field_sep, $item));
    }
    $arr[] = $temp;
}
 
$json = json_encode(array_values($arr), JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
echo $json;
0
0 / 0 / 0
Регистрация: 01.02.2015
Сообщений: 50
18.03.2017, 15:59  [ТС]
Kerry_Jr, ПОЧТИ все хорошо, формат тот, какой надо, но не все выводится, а только значения для complaint_id = 1 (для complaint_id = 2 не выводятся)
0
Эксперт PHP
 Аватар для Kerry_Jr
3106 / 2591 / 1219
Регистрация: 14.05.2014
Сообщений: 7,236
Записей в блоге: 1
18.03.2017, 16:11
vladly, покажите результат.
0
0 / 0 / 0
Регистрация: 01.02.2015
Сообщений: 50
18.03.2017, 16:20  [ТС]
Kerry_Jr,
JSON
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
[
        {
            "id":"1",
            "offer_id":"1",
            "user_name":"Петр",
            "text":"Некомпетентный сотрудник",
            "date":"12342",
            "reply":[
                {
                    "id":"1",
                    "compliant_id":"1",
                    "reply_name":"Женя",
                    "reply_text":"Разберемся",
                    "reply_date":"23897289"
                },
                {
                    "id":"2",
                    "compliant_id":"1",
                    "reply_name":"Макс",
                    "reply_text":"Это точно",
                    "reply_date":"2676723"
                },
                {
                    "id":"6",
                    "compliant_id":"1",
                    "reply_name":"Дима",
                    "reply_text":"Ответили уже",
                    "reply_date":"23321"
                }
            ]
        }
    ]
Добавлено через 3 минуты
Kerry_Jr, то есть нет этой части:
JSON
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
{
            "id":"2",
            "offer_id":"2",
            "user_name":"Иван",
            "text":"Ужасный сотрудник!",
            "date":"2324123",
            "reply":[
                {
                    "id":"5",
                    "complaint_id":"2",
                    "reply_name":"Стас",
                    "reply_text":"ОКЭ",
                    "reply_date":"23232"
                }
            ]
        }
0
Эксперт PHP
 Аватар для Kerry_Jr
3106 / 2591 / 1219
Регистрация: 14.05.2014
Сообщений: 7,236
Записей в блоге: 1
18.03.2017, 16:23
vladly, вы везде правильно заменили имена таблиц и столбцов?
1
0 / 0 / 0
Регистрация: 01.02.2015
Сообщений: 50
18.03.2017, 16:24  [ТС]
Kerry_Jr, да, иначе код не запускался
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
18.03.2017, 16:24
Помогаю со студенческими работами здесь

Преобразование Даты к заданному виду
Доброго дня! Есть время в unix формате , к примеру : 1366037818 Подскажите пожалуйста как перевести дату к такому виду:...

Преобразование матрицы к треугольному виду
Добрый вечер! Помогите пожалуйста, вопрос собственно в следующем. Нужно прямоугольную матрицу преобразовать в треугольную. Т.е. массив...

Преобразование матрицы к треугольному виду
Здравствуйте, возникла нестандартная задача: преобразовать матрицу (разреженную) к треугольному виду (все ненулевые элементы поместить на и...

Преобразование уравнения к каноническому виду
Есть уравнение в полярных координатах p=3(1+cos(t)), строю график и понимаю что полученная линия кардиоида. Дальше надо найти уравнение...

Преобразование многомерного массива к уникальному виду
Здравствуйте! Как мне преобразовать массив чтобы в нем остались только элементы у которых не повторяется название - $array Т.е...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru