如何用通配符比较同一张表中的两条记录?
Posted
技术标签:
【中文标题】如何用通配符比较同一张表中的两条记录?【英文标题】:How Do I Compare 2 Records In The Same Table with Wildcard? 【发布时间】:2013-08-16 20:52:49 【问题描述】:我需要比较同一个 mysql magento 表中的记录。有没有办法通过比较 url_key 和 url 来比较同一张表中的 2 条记录?我在下面发布了与我正在寻找的信息相对应的信息。
我希望这也能帮助其他在 Magento 数据库上工作的人,因为我已经发布了我之前的 2 个关于如何比较 2 个 mysql 表以确保为 magento 中的类别创建记录的查询。我发现如果 url-keys 和 url 不匹配,Magento 将无法运行平面文件重新索引。我进行了一些检查,以确保我的 url 在我的 catalog_category_entity_varchar 表和 core_url_rewrite 表中都是正确的。我最初跑了:
选择 *
来自catalog_category_entity_varchar
c2t
不存在的地方(
选择 *
来自core_url_rewrite
c
WHERE c.category_id = c2t.entity_id
)
确保我们所有的类别也都输入到 core_url 重写中。然后我运行另一个查询以确保两个表中的所有 url 都匹配:
选择 *
来自core_url_rewrite
c
不存在的地方(
选择 *
来自catalog_category_entity_varchar
c2t
在哪里 c2t.entity_id
= c.category_id
和 c2t.value
= c.request_path
)
现在我想再运行一个查询,以确保 catalog_category_entity_varchar 上的 url 也与其对应的 url 键正确,但我完全卡在它上面,不知道如何编写语句。
catalog_category_entity_varchar 表基本上如下所示:
catalog_category_entity_varchar:
记录 1: value_id: 68 entity_type_id: 3 属性 ID: 43 store_id: 0 entity_id: 10 价值: 则
记录 2: value_id: 73 entity_type_id: 3 属性 ID: 57 store_id: 0 entity_id: 10 值: shop-by.html
两个记录的 entity_id 均为 10。 url_key 的属性 ID 是 43,而 url ID 是 57。我想这些是我需要用来识别我正在比较的内容。
所以基本上我需要运行一个查询,将实体 id 相互匹配,然后将 url-key 与 url itslef 进行比较,以确保它包含 url 键。它将必须剥离 .html 以及 url 代码的任何其他部分,因为比第一级更深的记录看起来像 catalog/shirts/shop-by.html。
记录 3: value_id: 637 entity_type_id: 3 属性 ID: 57 store_id: 0 entity_id: 88 值: catalog/shirts/shop-by.html
此外,也会有记录包含此 URL-Key,但我假设由于查询将基于其主键 (entity_id),我们不必担心。
如果我没有以正确的格式写这篇文章,我深表歉意,因为我还是这个论坛的新手。我提前感谢您的帮助。如果有任何不清楚或需要更多信息,请告诉我。
【问题讨论】:
啊,好吧,通常在这里你会以问题的形式来表达它,然后如果你愿意,你可以勾选“回答我自己的问题”(它在“发布你的问题”按钮下) 并以这种方式回答自己。如果您键入答案作为您的问题,则无法接受。所以基本上,将您的帖子编辑为一个问题,然后在下面发布您的答案。 谢谢杰森,我不太清楚你的意思。我改写了上面的问题,但是当我编辑时,没有复选框来回答我自己的问题,就像你最初输入问题时那样。我在上面输入的 2 个 sql 查询是我之前所做的,但不是我现在正在研究的。 抱歉,按钮现在在我下方,在“认识可以回答的人吗?”之后。是黑灰色的按钮,上面写着“回答你的问题”;D。编辑您的问题,完成后您可以从这里回答 也许我真的很困惑。我明白你在说什么,但是如果我不知道答案,我会用什么来回答这个问题?哈哈 我觉得是我糊涂了,慢慢重读才看到你的问题。看起来你已经想通了。似乎您正朝着正确的方向前进,尽管我不擅长查询。通过一些研究,我也许可以通过 Magento 的 php 框架向您展示如何做到这一点。您可能想在编辑模式下玩耍,查看编辑帮助和问题发布指南以重组您的问题,使其更加突出:D 【参考方案1】:检查这个查询,它有点难看,但据我所知它确实有效。
SELECT `t1`.*, `t2`.`value` AS `url_path`
FROM `catalog_category_entity_varchar` AS `t1`
LEFT JOIN (
SELECT `catalog_category_entity_varchar`.`value`,
`catalog_category_entity_varchar`.`entity_id`,
`catalog_category_entity_varchar`.`attribute_id`
FROM `catalog_category_entity_varchar`
) AS `t2`
ON `t1`.`entity_id`=`t2`.`entity_id`
WHERE `t1`.`attribute_id` = 43
AND `t2`.`attribute_id` = 57
AND `t1`.`value` != `t2`.`value`
【讨论】:
出色的工作,非常感谢您花时间为我编写此代码。它帮助我更好地理解 MySQL 的工作原理。虽然,我也确实需要这个结果(我会说效果很好)我需要确切的对面。这段代码给了我所有匹配的 url_keys 和 url。我需要知道哪些不匹配,因为那些是出现错误并需要修复的。如何更改此代码以与 echo 完全相反? 为您添加了最后一个 AND where 语句。没有它,它应该返回所有记录,匹配和不匹配。 不知何故,它仍在提取所有信息。在近 50 万条记录中,有一条记录不匹配,我似乎找不到导致我的 CMS 出现重新索引错误的记录。我还尝试将 != 更改为旧版本 ,该版本还提取了除不匹配记录之外的所有记录。 不应该那样做,要么你的记录都不匹配,要么你的查询有问题。AND t1.value != t2.value
明确更正查询以找到所有 url_key != url_path。如果不是查询问题,则可能是将 .html 添加到所有 url_path 字符串中。以上是关于如何用通配符比较同一张表中的两条记录?的主要内容,如果未能解决你的问题,请参考以下文章