【问题标题】:PHP INNER JOIN sql query with multiple tables duplicated information具有多个表重复信息的PHP INNER JOIN sql查询
【发布时间】:2019-03-23 02:32:24
【问题描述】:

我在使用 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

表 p_images

还有其他的表格,但是展示一下就足够了(因为有很多表格,每个表格都是 1-M)

当我进行查询时,我会为 p_images(和其他表)中的每个信息获取 p_card 的信息:

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

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

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

【问题讨论】:

  • 请显示示例数据以证明重复项。在这里使用DISTINCTGROUP BY 可能是合适的。
  • 展示您的收获和期望,谢谢!
  • @TimBiegeleisen 。我已经编辑了线程,看看它是否更好理解。我真的不知道如何更好地解释。
  • @SalimIbrogimov 完成
  • 屏幕截图很难阅读。请以文本的形式包含数据。这里的目标不是包含大量数据,而是足以让人们明白这一点。很可能,有一个简单的解决方法可以解决您的问题,但目前还看不到答案。

标签: php mysql mysqli inner-join


【解决方案1】:

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

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

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

【讨论】:

  • 为了数据处理,我以单独的方式进行了查询,然后根据需要创建了一个数组。感谢您的建议。
猜你喜欢
  • 2018-06-26
  • 2014-02-24
  • 2021-03-04
  • 1970-01-01
  • 1970-01-01
  • 2015-08-01
  • 2015-01-19
  • 2020-08-10
  • 2013-02-27
相关资源
最近更新 更多