- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 eBay 类别,我正在寻找最有效的方法来检索匹配的“叶类别”(仅限顶级)列表及其完整的面包屑,当给定一个与部分类别名称匹配的术语时
这是一个sqlfiddle我一直在工作。
假设我只有两个叶子类别(1900 年后和 1900 年前)
这是他们的面包屑
Antiques > Antique Clocks > Bracket Clocks > Post-1900
Antiques > Antique Clocks > Bracket Clocks > Pre-1900
如果使用术语“Bracket”,则结果将包含两行,每个面包屑一行,但如果术语“Post-19”,则只会返回一行。每行应包含两个字段CategoryID
和breadcrumb
,CategoryID 必须是“叶类别”。
CREATE TABLE `ebay_categories` (
`CategoryID` int(11) DEFAULT NULL,
`CategoryName` varchar(20) DEFAULT NULL,
`CategoryParentID` int(11) DEFAULT NULL,
`CategoryLevel` int(11) DEFAULT NULL
);
insert into `ebay_categories` (`CategoryID`, `CategoryName`, `CategoryParentID`, `CategoryLevel`) values('20081','Antiques','20081','1');
insert into `ebay_categories` (`CategoryID`, `CategoryName`, `CategoryParentID`, `CategoryLevel`) values('13851','Antique Clocks','20081','2');
insert into `ebay_categories` (`CategoryID`, `CategoryName`, `CategoryParentID`, `CategoryLevel`) values('100904','Bracket Clocks','13851','3');
insert into `ebay_categories` (`CategoryID`, `CategoryName`, `CategoryParentID`, `CategoryLevel`) values('96762','Post-1900','100904','4');
insert into `ebay_categories` (`CategoryID`, `CategoryName`, `CategoryParentID`, `CategoryLevel`) values('66840','Pre-1900','100904','4');
我正在尝试实现与 here 相同的方法但一直失败得很惨。
SELECT LeafID as CategoryID, GROUP_CONCAT(CategoryName SEPARATOR ' > ') AS breadcrumb FROM (
(SELECT CategoryID as LeafID AS
SELECT * from ebay_categories WHERE CategoryName LIKE '%Antiq%') AS c
) AS b GROUP BY LeafID
) AS a ORDER BY breadcrumb ASC Limit 20
最佳答案
SQL 只能(不“聪明”地使用存储过程等)返回固定数量的列。
(仅供引用 - 你链接到的答案,恕我直言是“聪明的”。它正在用 session 变量等做一些非常明显的事情,如果它们不损害性能就会损害可读性 - 所以我'我将尝试从不同的角度回答您的问题。)
因此,您可以修复(硬编码)面包屑“深度”,并且使用固定数量的 JOIN 语句,一切都变得非常简单。
我假设面包屑深度是 1 到无穷大之间的任何值?即,另一个项目“集合”可以归档在更小的类别深度下?
在这种情况下,您的 GROUP_CONCAT
可能是解决方案的一部分,因为它模拟了 SQL 中的“可变列计数”。 (它返回为 1 列,但内部可以包含灵活数量的分隔值。)
您的问题仍然是 SQL 的性质仍然只能在每个 JOIN
语句中将一个表连接到另一个(单个)表。您的面包屑数据结构已很好地规范化,并假定每个子类别与其父类别都有一个连接。
您可以尝试动态构建 SQL - 但这可能会让您感到吃力。您可能只剩下两个“显而易见的”选项:
存储过程可以通过多种方式解决这个问题 - 一个明显的选择是通过程序化构建每个面包屑来迭代,将范围存储在临时表中,然后最终选择整个临时表。
我很乐意就此为您提供指导,但我不会将其作为此答案的一部分(除非有要求),因为我相当确定性能会非常糟糕,您最终不会想要使用它。
另一个“主要”选项是重构架构。在这种情况下,您所达到的规范化水平使事情变得过于复杂。这在“学术上”很好,而且对磁盘空间也有好处。但它并不能很好地解决您的问题!
去规范化还有另一个主要的权衡。更改模式中的数据时会更加复杂。我建议从编写一个“重建”数据的例程开始(如果你采用这种方法),因为否则事情会变得不同步,你将永远花时间试图找出问题所在。 (我的经验之谈。)
对于每个匹配的记录(您正在将用户输入与 CategoryName
进行比较),您希望返回并能够按树中它之前的所有内容进行分组。而且没有做“聪明”的事情。
(几种)非规范化方法之一是为祖先维护一个depth * width
长叶列表。 (正如我所说,它的存储效率不高。您必须评估这是否是生产场景中的问题。)对于您的示例数据,它看起来像这样:
+------------+--------+
| AncestorId | LeafId |
+------------+--------+
| 20081 | 66840 |
| 20081 | 96762 |
| 13851 | 66840 |
| 13851 | 96762 |
| 100904 | 66840 |
| 100904 | 96762 |
| 66840 | 66840 |
| 96762 | 96762 |
+------------+--------+
因此现在你可以做这样的事情:
CREATE TABLE `tree_branches` (
`AncestorId` int(11) NOT NULL,
`LeafId` int(11) NOT NULL
);
INSERT INTO `tree_branches` SET `AncestorId`=20081, `LeafId`=66840;
INSERT INTO `tree_branches` SET `AncestorId`=20081, `LeafId`=96762;
INSERT INTO `tree_branches` SET `AncestorId`=13851, `LeafId`=66840;
INSERT INTO `tree_branches` SET `AncestorId`=13851, `LeafId`=96762;
INSERT INTO `tree_branches` SET `AncestorId`=100904, `LeafId`=66840;
INSERT INTO `tree_branches` SET `AncestorId`=100904, `LeafId`=96762;
INSERT INTO `tree_branches` SET `AncestorId`=66840, `LeafId`=66840;
INSERT INTO `tree_branches` SET `AncestorId`=96762, `LeafId`=96762;
SELECT
GROUP_CONCAT(`breadCrumbCategories`.`CategoryName` SEPARATOR " > ")
FROM `ebay_categories` AS `matchedCategory`
INNER JOIN `tree_branches` AS `matchedCategoryLeaves` ON (`matchedCategoryLeaves`.`AncestorId` = `matchedCategory`.`categoryId`)
INNER JOIN `tree_branches` AS `breadCrumbs` ON (`breadCrumbs`.`LeafId` = `matchedCategoryLeaves`.`LeafId`)
INNER JOIN `ebay_categories` AS `breadCrumbCategories` ON (`breadCrumbCategories`.`CategoryId` = `breadCrumbs`.`ancestorId`)
WHERE
`matchedCategory`.`CategoryName` LIKE "Post%"
GROUP BY
`breadCrumbs`.`LeafId`
;
您应该为 GROUP_BY
添加某种排序,以确保它不会执行某些隐含的意外操作。您可以(例如)为此目的维护一个关卡 ID。
更新:一旦您理解了我在上面所做的事情,您应该使用 LIKE 'Ant%'
对其进行测试并观察错误输出。添加第二个 GROUP BY
子句和一个 DISTINCT
来解决由用户查询匹配多个面包屑引起的问题,这些面包屑是同一叶的祖先。
SELECT
DISTINCT GROUP_CONCAT(`breadCrumbCategories`.`CategoryName` SEPARATOR " > ")
FROM `ebay_categories` AS `matchedCategory`
INNER JOIN `tree_branches` AS `matchedCategoryLeaves` ON (`matchedCategoryLeaves`.`AncestorId` = `matchedCategory`.`categoryId`)
INNER JOIN `tree_branches` AS `breadCrumbs` ON (`breadCrumbs`.`LeafId` = `matchedCategoryLeaves`.`LeafId`)
INNER JOIN `ebay_categories` AS `breadCrumbCategories` ON (`breadCrumbCategories`.`CategoryId` = `breadCrumbs`.`ancestorId`)
WHERE
`matchedCategory`.`CategoryName` LIKE "An%"
GROUP BY
`breadCrumbs`.`LeafId`,
`matchedCategory`.`CategoryId`
;
关于php - 带有 LIKE 的递归 SELECT 类别面包屑在单个查询中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34287400/
如何使用 Meteor 实现响应式(Reactive)面包屑和铁路由器? 现在我正在寻找由 react session 变量触发的当前路径,然后在 DOM 中添加与该路由对应的每个链接与 jQuery
我想知道grails中面包屑的用法和实现。 我有一些gsp(view)页面,主页是默认页面,我有6个类别,在那6个子页面中,我需要在我的页面中显示导航路径,例如 家庭/杂货/杂货店... 家庭/财务/
我想创建一个包含一个动态项目的面包屑导航。像这样的事情: Home > Category A > Subcategory 1 > XYZ 其中“类别 A”和“子类别 1”是静态的,“XYZ”是动态的。
我想创建一个包含一个动态项目的面包屑导航。像这样的事情: Home > Category A > Subcategory 1 > XYZ 其中“类别 A”和“子类别 1”是静态的,“XYZ”是动态的。
我正在尝试在我的 React 项目中实现面包屑布局。我没有使用 router4 来呈现 URL。此时面包屑出现的样子。 Home |Test Update |Testssss |Test11111 我
我需要将树状结构更改为一些重定向(面包屑方式)。我认为问题在于我只构建了重定向的第一部分,而没有以某种方式正确回填。我一直正确地完成重定向的第一部分,但是一旦我必须重置网址,就会失败: 不想要的结果
当您使用 ul 元素来格式化面包屑(旨在获得更好的 Google 搜索结果)时,您如何定义 RDFa 标记?我问的原因是 li 元素是彼此的 sibling ,而不是 child 。我正在做类似的事情
我从 Themeisle 买了一个支持 WooCommerce 的 WordPress 模板 Zerif Pro。模板 WooCommerce 页面不显示允许用户从一个页面导航到另一个页面的面包屑。下
我想从 magento 页面中删除面包屑,尤其是产品详细信息和产品列表页面。 这可以在不更改任何代码的情况下完成吗?仅在管理面板内? 最佳答案 最好的方法是去: 系统 --> Web --> 默认页面
目前我在 vue.js 2.0 中的 BreadCrumbs 看起来像这样: Forum
我正在尝试使用 clip-path 制作面包屑路径。 #clip span { padding: 3px 20px; background-color: #666; color: whit
由于我无法在任何地方找到合适的 RDFa 示例,我想我应该在这里问一个问题。在 Google's page有使用微数据或 RDFa 标记的面包屑示例。当您单击“示例 2”旁边的“RDFa”下的“查看标
早上好,我创建了我们网站组合的前端,我需要一点帮助(头脑不合适=)) 问题是:我需要开发带有面包屑和图像的标题 我知道图像上的父类必须有 position: relative 和 childrens
我正在使用 Spring MVC + 磁贴。 现在我想构建面包屑。所以,我正在使用这个: https://github.com/pawanspace/BreadCrumb-Spring-MVC 它运行
我坚持启动 CSS 来构建面包屑,如下图链接所示。感谢您的帮助 :) 图片- http://s1015.photobucket.com/user/dbf1655/media/bred.png.html
我正在使用 ControlsFX 的 BreadcrumbBar,效果很好。我唯一的问题是将其样式设置为如下图所示。使用风景 View 时,我看到该组件只有三个类 .bread-crumb-bar、.
我想为一个页面做一种面包屑,文件夹嵌套在它的页面上。在 Sitecore 中看起来像这样: home/ main/ sub/ Folder1/ Pag
我有一个问题。我还没有找到谷歌应该如何查看产品页面面包屑的信息。尝试了一些修复,但这些都没有正常工作。例如,如果我转到产品 www.domain.com/shoes-255并在此工具中使用它 http
在 WordPress 中,我目前使用的是 Yoast's SEO Plugin显示breadcrumbs对于我的页面和帖子,在访问特定页面时工作正常。 这是我用来在我的 WordPress 模板中显
我想在用户在 magento 前端导航我自己的模块时显示面包屑,该网站已经有适当的面包屑代码,可以按照标准 magento 面包屑在其他地方使用。 我需要在我的模块中做什么来指定当前面包屑路径? 我更
我是一名优秀的程序员,十分优秀!