我在使用INNER JOIN进行查询以从多个表中获取所有信息时遇到了一些麻烦。表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_cards中的信息重复。
例如,p_images表将具有id
,p_id
,image
,language
。对于与该ID相关联的每个图像,它将关联p_cards的信息。
我希望没有重复的信息。我该如何实现?
编辑:
还有其他表,但足以显示它(因为有很多表,每个表都以1-M的形式工作
当我执行查询时,我获得p_images(和其他表)中每个信息的p_card信息:
通过这种方式,我希望得到类似的信息,因此我可以使用该信息来制作表格来编辑数据:
id
slug
card_number
...
--[images]
---[en]
----thumb_img
----full_size
----name
---[pt]
----thumb_img
...
而不是只包含所有信息的一行。 最好的方法是什么?
答案 0 :(得分:0)
对于同一个卡号,您会得到多行,因为您要加入的表中有多行。
如果每个卡ID仅希望包含一行,则可以使用GROUP BY p_cards.id,然后使用GROUP_CONCAT()函数获得其他表中不同值的逗号分隔列表。
但是,在您的情况下,我认为最好执行3个单独的查询,而不是在联接中执行。