代码之家  ›  专栏  ›  技术社区  ›  Tiago

具有多表重复信息的PHP内部连接sql查询

  •  1
  • Tiago  · 技术社区  · 7 年前

    p_cards 是“主表”,关系为1-M。这意味着每隔一张桌子( p_images , p_infotext , p_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\u卡中的信息为每个表复制。 例如,p\u images表将具有 id p_id , image language . 对于与该ID相关联的每个存在的图像,它将关联p\u卡的信息。

    我想要的是不要有重复的信息。我怎样才能做到这一点?

    编辑:

    表p\U卡 Table p_cards

    表p\U图像 t p_images

    当我进行查询时,我得到了p\图像(和其他表)中每个信息的p\卡信息: enter image description here

    这样我就可以得到这样的信息,这样我就可以使用这些信息制作一个表单来编辑数据:

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

    最好的方法是什么?

    1 回复  |  直到 7 年前
        1
  •  0
  •   The Surrican    7 年前

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

    如果希望每个卡id只有一行,可以使用GROUP BY p\u cards.id,然后可以使用GROUP\u CONCAT()函数获得其他表中不同值的逗号分隔列表。

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

    推荐文章