【问题标题】:How to check if some string is combination of values from two separate columns i.e tables PHP MySql如何检查某个字符串是否是来自两个单独列的值的组合,即表 PHP MySql
【发布时间】:2019-01-29 01:40:51
【问题描述】:

我需要最便宜的方法来检查我的 url slug 是否由来自两个单独表的两个单独列的值形成。

我将使用带有商店和位置的虚拟示例,以使其更易于阅读。 我有以下网址:

www.domain.com/store-location

这可能是,例如:

www.domain.com/three-words-store-chicago or
www.domain.com/nicestore-new-york-or-some-neighbourhood-with-more-words or
www.domain.com/oneword-oneword

(你明白了)

商店位于称为商店的表中,表中的位置称为位置。 所有的组合在理论上都是可能的。 所以,我需要一些巧妙的 mysql 查询与 php 相结合,以检查我的 slug(.com/ 之后的内容)是否是 store+location 的确切组合。因此,为了使其更具描述性:

url: www.domain.com/cool-store-los-angeles

检查表stores.slug_stores 中是否有“cool-store”,表locations.slug_location 中是否有“los-angeles”。正如您在上面看到的,两者的字数都未定义,所以我没有任何可能的分隔符。

这必须是最便宜的方式,因为这两个表表都有大约 1000 行。请帮助,谢谢你们!

ps。重要提示:我不得以任何方式更改网址

编辑:这是真正的项目,网站。根据 url 即 slug 我返回一些带有数据的视图。所以我需要检查 www.domain.com/nicestore-nicecity 如果 Nicestore 和 Nicecity 存在于表存储和位置中,如果不存在,或者是否还有其他东西,例如 www.domain.com/nicestore-nicecityBLABLA 以杀死该页面404。否则,如果有 Nicestore 和 Nicecity 返回一些填充了相关数据的页面。到目前为止,我尝试使用“nicestore-nicecity”等已形成的 slug 制作单独的表,并将其用于查询“SELECT whatever FROM slugs WHERE what = 'nicestore-nicecity' 以及如果有行返回我需要显示页面的任何内容。 .. 简化了... 但是,这个单独的表很难维护。如果 nicestore 移动到uglycity,或者如果它更改名称,或者如果您添加新商店或新城市。我希望我现在更清楚;-)

【问题讨论】:

  • “我不能以任何方式更改 URL” ????你真的给自己挖了一个难关。 /store-name/location-name 会容易得多
  • @Phil,我并没有自己挖掘这一切,我继承了它:-(。我同意你的观点,当我“挖掘”其他项目时,我完全按照你说的做了。 ;-)
  • 你有没有尝试过?如果是这样,您应该将您的尝试添加到您的问题中。我有一些想法,但没有一个特别有效,尽管筛选一百万种可能的组合可能不会对你的数据库征税
  • @Phil 我有一个名为 urls 的单独表格,其中包含已连接的商店和位置组合。很难维护,地址,名称,新商店,新城市的任何变化......所以,我希望一些 php/mysql 大师可能会有所帮助:-D
  • 为什么不把它设为VIEW?这样它总是最新的

标签: php mysql clean-urls


【解决方案1】:

我假设您没有任何id 值可用于JOIN 您的表,并且您没有能力创建此类值。在这种情况下,由于您的商店/位置组合可能与 oneword-oneword 一样短,因此 slug 的第一个和最后一个词大约是您可以搜索的内容。您可以使用 SUBSTRING_INDEX 提取 slug 的开始和结束部分,并使用它来缩小每个表中的匹配集您尝试比较整个字符串之前。在我的示例中,我使用 SQL 变量来存储 slug:

SET @store = 'cool-store-los-angeles'
SELECT *
FROM (SELECT * 
      FROM stores 
      WHERE store LIKE CONCAT(SUBSTRING_INDEX(@store, '-', 1), '%')) s
JOIN (SELECT * 
      FROM locations 
      WHERE location LIKE CONCAT('%', SUBSTRING_INDEX(@store, '-', -1))) l
WHERE CONCAT(s.store, '-', l.location) = @store

这将返回与cool-store-los-angeles 关联的所有数据,假设存在这样的商店。

Demo on dbfiddle

【讨论】:

    【解决方案2】:

    这是我对您系统的了解...

    1. 您有一个stores 表,其中包含slug_stores
    2. 您有一个locations 表,其中包含slug_location

    我将假设每个表都有一个 id 某种类型的列。我还将假设他们使用第三个联结表具有 多对多 关系,类似于

    CREATE TABLE store_locations (
      store_id <type>,
      location_id <type>,
      PRIMARY KEY (store_id, location_id),
      FOREIGN KEY (store_id) REFERENCES stores(id),
      FOREIGN KEY (location_id) REFERENCES locations(id)
    );
    

    如果你没有定义这种关系,我真的不知道你如何维护你的商店位置。


    我的建议是创建一个VIEW 来计算和表示您的网址。比如……

    CREATE VIEW store_location_urls AS
    SELECT
      sl.store_id,
      sl.location_id,
      CONCAT_WS('-', s.slug_stores, l.slug_location) AS slug
    FROM store_locations sl
    INNER JOIN stores s ON sl.store_id = s.id
    INNER JOIN locations l ON sl.location_id = l.id;
    

    现在您可以使用此视图执行以下操作...

    1. 检查请求 URL slug 是否有效

      SELECT store_id, location_id FROM store_location_urls WHERE slug = ?
      

      如果这返回一条记录,那么您可以进一步查询 storeslocations 表以获取呈现页面所需的任何额外数据(或者甚至只是将它们加入原始查询中)。否则,使用

      http_response_code(404);
      
    2. 获取特定商店的所有 URL slug

      SELECT slug FROM store_location_urls WHERE store_id = ?
      
    3. 同样,您可以获得特定位置的所有 URL slug


    额外注意...由于连接字符串,您在stores.slug_storeslocations.slug_location 上的任何索引对于上面的VIEW 都将无用。另一种方法是使用真正的派生表(就像您目前拥有的那样)并使用触发器对其进行维护。

    【讨论】:

      【解决方案3】:

      我认为您可以在 mysql 中进行如下查询,然后在 php 中进行检查。根据您的描述,听起来这些表之间不可能有任何连接,所以我认为需要联合。

      select col1,col2 from stores where slug_stores = ? union select col1,col2 from locations where slug_location = ?

      【讨论】:

        猜你喜欢
        • 2012-07-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-01-21
        • 2021-01-11
        • 2017-10-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多