如何用通配符比较同一张表中的两条记录?

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_varcharc2t 不存在的地方( 选择 * 来自core_url_rewritec WHERE c.category_id = c2t.entity_id )

确保我们所有的类别也都输入到 core_url 重写中。然后我运行另一个查询以确保两个表中的所有 url 都匹配:

选择 * 来自core_url_rewritec 不存在的地方( 选择 * 来自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 字符串中。

以上是关于如何用通配符比较同一张表中的两条记录?的主要内容,如果未能解决你的问题,请参考以下文章

Netezza SQL 比较同一表中的两条记录

减去表中同一列的两条记录

如何为mysql中的每条记录检索表中的两条记录

SQL 如何将一个表中的两条或多条拥有相同ID的记录合并为一条?

怎样用Sql语句判断一张表中的两条数据相同

怎样用Sql语句判断一张表中的两条数据相同