PHP INNER JOIN sql查询具有多个表的重复信息

时间:2018-10-18 09:47:57

标签: php mysql mysqli inner-join

我在使用INNER JOIN进行查询以从多个表中获取所有信息时遇到了一些麻烦。表p_cards是具有1-M关系的“主表”。这意味着每个其他表(p_imagesp_infotextp_rules可以具有与同一ID相关联的多行)

我的功能如下:

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表将具有idp_idimagelanguage。对于与该ID相关联的每个图像,它将关联p_cards的信息。

我希望没有重复的信息。我该如何实现?

编辑:

表p_cards Table p_cards

表p_images t p_images

还有其他表,但足以显示它(因为有很多表,每个表都以1-M的形式工作

当我执行查询时,我获得p_images(和其他表)中每个信息的p_card信息: enter image description here

通过这种方式,我希望得到类似的信息,因此我可以使用该信息来制作表格来编辑数据:

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

而不是只包含所有信息的一行。 最好的方法是什么?

1 个答案:

答案 0 :(得分:0)

对于同一个卡号,您会得到多行,因为您要加入的表中有多行。

如果每个卡ID仅希望包含一行,则可以使用GROUP BY p_cards.id,然后使用GROUP_CONCAT()函数获得其他表中不同值的逗号分隔列表。

但是,在您的情况下,我认为最好执行3个单独的查询,而不是在联接中执行。