mysql — PHP SQL оставил объединиться, чтобы получить все

У меня есть 3 таблицы MySQL, откуда я пытаюсь получить данные
Таблица: список

list_id  |  name  |  description
-------------------------------------
1234     |  name1 | sample description1
1235     |  name2 | sample description2

Таблица: list_to_category

id     |  list_id  | category_id
--------------------------------
1      |  1234     | 1
2      |  1234     | 2
3      |  1234     | 3
4      |  1235     | 2
5      |  1235     | 3

И таблица: категория

id     |  title      | parent_id
--------------------------------
1      |  Category 1 | 0
2      |  Category 2 | 0
3      |  Category 3 | 0

И из запроса PHP SQL я хочу получить данные, как показано ниже

1. name1 - category 1, category 2, category 3
2. name2 - category 2, category 3

Я пробовал ниже запрос

SELECT list.name, category.title FROM list

LEFT JOIN list_to_category
ON list.id = list_to_category.list_id

LEFT JOIN category
ON list_to_category.id = category.id

Это дает мне только одно имя категории, назначенное на список, как это

1. name1 - category 1
2. name2 - category 2

Возможно ли это в одном запросе?

2

Решение

Вы можете использовать GROUP_CONCAT для этого:

select
l.list_id,
l.name,
group_concat(distinct c.title) categories
from list l
left join list_to_category lc
on l.list_id = lc.list_id
left join category c
on lc.category_id = c.id
group by l.list_id
2

Другие решения

Вы можете попробовать это решение.

select l.list_id, l.name, (select group_concat(c.title) from list_to_category ltc JOIN category c ON c.id=ltc.category_id where ltc.list_id=l.id) from list l

Надеюсь, что это поможет вам!!!

1

Используйте GROUP_CONCAT для группы по «имени», чтобы получить результат:

SELECT L.name, GROUP_CONCAT(C.title) as title  FROM list L
LEFT outer  JOIN list_to_category LC  ON L.list_id = LC.list_id
LEFT outer JOIN category C  ON LC.category_id = C.id
group by L.name

Используйте GROUP_CONCAT для группы по «list_id» для того же имени списка, чтобы получить результат:

SELECT L.name, GROUP_CONCAT(C.title) as title  FROM list L
LEFT outer  JOIN list_to_category LC  ON L.list_id = LC.list_id
LEFT outer JOIN category C  ON LC.category_id = C.id
group by L.list_id
1

Из приведенного ниже кода должно быть очевидно, что я не программист PHP. Тем не менее, это должно донести идею. Вы также можете использовать javascript / css для обработки преобразования, что означает, что все может быть еще более динамичным …

О, и я изменил некоторые имена таблиц / столбцов — потому что мне так больше нравится …

<?php

require('path/to/connection/statements'); // $con

$query = "SELECT l.list_id
, l.name
, l.description
, c.category_id
, c.title
, c.parent_id
FROM list l
JOIN list_category lc
ON lc.list_id = l.list_id
JOIN category c
ON c.category_id = lc.category_id
ORDER
BY l.list_id
, c.category_id;
";

$result = mysqli_query($con,$query);

$my_array = array();

while($row = mysqli_fetch_assoc($result)){
$my_array[] = $row;
}

$new_array = array();
foreach ($my_array as $row)
{
$new_array[$row['list_id']][$row['name']][$row['description']][] = $row['title'];
}

print_r($new_array);

?>

Это превратит массив следующим образом:

Array
(
[0] => Array
(
[list_id] => 1234
[name] => name1
[description] => sample description1
[category_id] => 1
[title] => Category 1
[parent_id] => 0
)

[1] => Array
(
[list_id] => 1234
[name] => name1
[description] => sample description1
[category_id] => 2
[title] => Category 2
[parent_id] => 0
)

[2] => Array
(
[list_id] => 1234
[name] => name1
[description] => sample description1
[category_id] => 3
[title] => Category 3
[parent_id] => 0
)

[3] => Array
(
[list_id] => 1235
[name] => name2
[description] => sample description2
[category_id] => 2
[title] => Category 2
[parent_id] => 0
)

[4] => Array
(
[list_id] => 1235
[name] => name2
[description] => sample description2
[category_id] => 3
[title] => Category 3
[parent_id] => 0
)

)

…в массив, как это …

Array
(
[1234] => Array
(
[name1] => Array
(
[sample description1] => Array
(
[0] => Category 1
[1] => Category 2
[2] => Category 3
)

)

)

[1235] => Array
(
[name2] => Array
(
[sample description2] => Array
(
[0] => Category 2
[1] => Category 3
)

)

)

)
0

попробуй этот код

select l.name,c.title
from list_to_category lc join list l on lc.list_id=l.id
join category c on lc.catg_id=c.id
0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector