PHP INNER JOIN SQL-запрос с дублированием информации в нескольких таблицах - PullRequest
0 голосов
/ 18 октября 2018

У меня возникли проблемы с выполнением запроса, который получает всю информацию из нескольких таблиц с помощью INNER JOIN.Таблица p_cards является «основной таблицей», которая имеет отношение 1-M.Это означает, что любая другая таблица (p_images, p_infotext, p_rules может иметь несколько строк, связанных с одним и тем же идентификатором)

Моя функция следующая:

function GetpById($mysqli, $id) {
    if($stmt = $mysqli->prepare("
        SELECT * 
        FROM p_cards 
        INNER JOIN p_images ON p_images.card_id = p_cards.id
        INNER JOIN p_infotext ON p_infotext.card_id = p_cards.id
        INNER JOIN p_rules ON p_rules.card_id = p_cards.id
        WHERE p_cards.id = ?
    ")) {
        $stmt->bind_param("i", $id);
        $stmt->execute() or trigger_error($stmt->error, E_USER_ERROR);
        ($stmt_result = $stmt->get_result()) or trigger_error($stmt->error, E_USER_ERROR);
        if ($stmt_result->num_rows>0) {
            while($row_data = $stmt_result->fetch_assoc()){
                $array[] = $row_data;
            }
            return $array   
        } else {
            return false;
        }
    } else {
        return false;
    }
}

Использованиевышеупомянутая функция создаст полную строку для каждой отдельной строки внутри других таблиц, делая информацию в p_cards дублированной для каждой.Например, таблица p_images будет иметь id, p_id, image, language.Для каждого изображения, связанного с этим идентификатором, оно будет ассоциировать информацию с p_cards.

Я бы не хотел иметь дублированную информацию.Как мне этого добиться?

Редактировать:

Таблица p_cards Table p_cards

Таблица p_images t p_images

Существуют и другие таблицы, но этого достаточно, чтобы показать их (поскольку существует много таблиц, каждая из которых работает как 1-M)

Когда я выполняю запрос, я получаюинформация p_card для каждой информации в p_images (и других таблицах): enter image description here

Таким образом, я ожидаю получить что-то подобное, поэтому я могу использовать эту информацию для создания формы дляотредактируйте данные:

id
slug
card_number
...
--[images]
---[en]
----thumb_img
----full_size
----name
---[pt]
----thumb_img
...

Вместо одной строки со всей информацией.Какой будет лучший подход?

1 Ответ

0 голосов
/ 18 октября 2018

Вы получаете несколько строк для одного и того же идентификатора карты, потому что у вас есть несколько строк для него в таблицах, к которым вы присоединяетесь.

Если вы хотите иметь только одну строку для идентификатора карты, вы можете использовать GROUP BY p_cards.id, а затем вы можете получить разделенный запятыми список других значений в других таблицах, используя функцию GROUP_CONCAT ().

Однако, в вашей ситуации, я думаю, что лучше сделать 3 отдельных запроса вместо выполненияэто в соединении.

...