gpt4 book ai didi

php - 只过滤掉一些与SQL有共同点的参数

转载 作者:行者123 更新时间:2023-11-30 01:26:13 24 4
gpt4 key购买 nike

我现在已经构建了一个 SQL 命令,可以列出具有多个输入的结果。

输入 ID 30 和 31 看起来像这样

    $sql ="SELECT ItemRelation.ItemRelTo, ItemRelation.Item, Items.CatID, Items.ItemID,   
Items.Title, Items.Image, Items.Desc, Items.TimeStamp
FROM Items
INNER JOIN ItemRelation
ON ItemRelation.ItemRelTo=Items.ItemID
WHERE ItemRelation.Item In (30,31)
UNION
SELECT ItemRelation.ItemRelTo, ItemRelation.Item, Items.CatID, Items.ItemID,
Items.Title, Items.Image, Items.Desc, Items.TimeStamp
FROM Items
INNER JOIN ItemRelation
ON ItemRelation.Item=Items.ItemID
WHERE ItemRelation.ItemRelTo In (30,31)";

我的关系表是

Item    ItemRelTo
30 10
31 12
11 12
11 31
30 11

因此,我的 SQL 的结果是 Items.ItemID 10,11,11,12,因此我得到了第 11 项的重复项。

我真正想要的是我的输入 (30,31) 的共同点,即 Items.ItemID = 11 而不是重复值,因此只有一个结果。

我对此很陌生,所以请解释一下,以便白痴也能理解 =)

我如何显示结果的其余代码是

$result = mysqli_query($con,$sql);
while($row = mysqli_fetch_array($result))
{
echo '<tr>';
echo '<td>' . $row['ItemID'] . '</td>';
echo '<td>' . $row['Item'] . '</td>';
echo '<td>' . $row['CatID'] . '</td>';
echo '<td>' . $row['Title'] . '</td>';
echo '<td><img src="Image/',$row['Image'],'"></td>';
echo '<td>' . $row['Desc'] . '</td>';
echo '<td>' . $row['TimeStamp'] . '</td>';
echo '</tr>';
}

这成为我的解决方案。当数据库增长时,可能不是使用计数的最佳方法。感谢迈克帮助我实现了这一目标!

SELECT   Items.ItemID, GROUP_CONCAT(ItemRelation.ItemRelTo) AS ItemRelTo, Items.CatID,    
Items.Title, Items.Image, Items.Desc, Items.TimeStamp
FROM Items
INNER JOIN ItemRelation
ON Items.ItemID = ItemRelation.Item
Where ItemRelTo IN (30,31)
Group By ItemID
HAVING COUNT(Items.ItemID) > 1

最佳答案

首先,我不会使用 UNION。您可以轻松地编写此 SQL,如下所示:

SELECT
ItemRelation.ItemRelTo,
ItemRelation.Item,
Items.CatID,
Items.ItemID,
Items.Title,
Items.Image,
Items.Desc,
Items.TimeStamp
FROM Items
FULL JOIN ItemRelation
WHERE
(
Items.ItemID = ItemRelation.Item
OR Items.ItemID = ItemRelation.ItemRelTo
) AND
(
ItemRelation.Item IN(30,31)
OR ItemRelation.ItemRelTo IN(30,31)
)

其次,为了仅显示 DISTINCT id,您需要从选择中删除 ItemRelation 数据并使用 SELECT DISTINCT Items.ItemID ,如下所示:

SELECT
DISTINCT Items.ItemID,
Items.CatID,
Items.Title,
Items.Image,
Items.Desc,
Items.TimeStamp
FROM Items
FULL JOIN ItemRelation
WHERE
(
Items.ItemID = ItemRelation.Item
OR Items.ItemID = ItemRelation.ItemRelTo
) AND
(
ItemRelation.Item IN(30,31)
OR ItemRelation.ItemRelTo IN(30,31)
)

或者您可以使用 GROUP BY Items.ItemID,但随后您需要决定如何呈现 ItemRelation 数据的不同值。因为在没有特定聚合的情况下执行 GROUP BY 会给您带来不可预测的结果。出于演示目的,我可能建议使用 GROUP_CONCAT

SELECT
Items.ItemID,
GROUP_CONCAT(ItemRelation.ItemRelTo) AS ItemsRelatedTo,
GROUP_CONCAT(ItemRelation.Item) AS ItemRelations,
Items.CatID,
Items.Title,
Items.Image,
Items.Desc,
Items.TimeStamp
FROM Items
FULL JOIN ItemRelation
WHERE
(
Items.ItemID = ItemRelation.Item
OR Items.ItemID = ItemRelation.ItemRelTo
) AND
(
ItemRelation.Item IN(30,31)
OR ItemRelation.ItemRelTo IN(30,31)
)
GROUP BY Items.ItemID

这里真正的问题是你的架构。如果这些关系是多对多和非定向的(这似乎是您尝试查询此数据的方式),那么您应该做的是将前向和后向关系都放入关系表中,当建立关系。这允许在任一方向进行查找,并防止您需要在查询中执行相当于重复 WHERE 子句的操作。

因此,更新您的示例数据,您将得到以下结果:

Item    ItemRelTo
30 10
10 30
31 12
12 31
11 12
12 11
11 31
31 11
30 11
11 30

这将允许您使用大大简化的查询来查找具有关系的任何项目

SELECT
Items.ItemID,
GROUP_CONCAT(ItemRelation.ItemRelTo) AS ItemsRelatedTo,
Items.CatID,
Items.Title,
Items.Image,
Items.Desc,
Items.TimeStamp
FROM Items
INNER JOIN ItemRelation
ON Items.ItemID = ItemRelation.Item
WHERE ItemRelation.ItemRelTo IN(30,31)
GROUP BY Items.ItemID

关于php - 只过滤掉一些与SQL有共同点的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17958247/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com