- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我现在已经构建了一个 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/
用于 Java 的 not-yet-commons SLL 包提供了一个 OpenSSL 对象和一个基于密码的加密方法: 加密(“des”,密码,数据); 据说此方法与 OpenSSL C 库兼容。我
我是一名优秀的程序员,十分优秀!