Как проверить, является ли некоторая строка комбинацией значений из двух отдельных столбцов, т.е. таблиц PHP MySql - PullRequest
0 голосов
/ 29 января 2019

Мне нужен наименее дорогой способ проверить, сформирован ли мой URL-слаг из значений из двух отдельных столбцов из двух отдельных таблиц.

Я буду использовать фиктивный пример с магазинами и местоположениями, чтобы сделать его более читабельным для человека,У меня есть следующий URL:

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, который проверит, является ли мой слаг (то, что идет после .com /) точной комбинацией store + location.Итак, чтобы сделать его более наглядным:

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

Проверьте, есть ли "cool-store" в таблице stores.slug_stores и есть ли "los-angeles" в таблице location.slug_location.Количество слов в обоих случаях не определено, как вы можете видеть выше, поэтому у меня нет никакого возможного разделителя.

ЭТО ДОЛЖЕН БЫТЬ НАИМЕНЬШИЙ ДОРОГОЙ СПОСОБ, потому что в обеих таблицах таблиц около 1000 строк.ПОЖАЛУЙСТА, ПОМОГИТЕ И СПАСИБО, ПАРНИ!

пс.ВАЖНО: Я НЕ ДОЛЖЕН ИЗМЕНЯТЬ URL-адреса ЛЮБЫМ СПОСОБОМ

Редактировать: Это реальный проект, веб-сайт.В зависимости от URL, т.е. слизняк, я возвращаю некоторое представление с данными.Поэтому мне нужно проверить на www.domain.com/nicestore-nicecity, существуют ли Nicestore и Nicecity в таблицах магазинов и локаций, и если нет, то есть ли что-нибудь еще, например www.domain.com/nicestore-nicecityBLABLA, чтобы убить эту страницус 404. В противном случае, если есть Nicestore и Nicecity, нужно вернуть страницу, заполненную соответствующими данными.До сих пор я пытался создать отдельную таблицу с сформированными слагами, такими как «nicestore-nicecity», и использовать ее для запросов «SELECT what FROM slugs WHERE независимо от = nicestore-nicecity» и, если есть строка, возвращает все, что мне нужно, чтобы показать страницу... Упрощенно ... Но эту отдельную таблицу трудно поддерживать. Если nicestore переходит в уродливый город, или если он меняет название, или если вы добавляете новый магазин или новый город. Надеюсь, теперь мне стало понятнее; -)

Ответы [ 3 ]

0 голосов
/ 29 января 2019

Вот что я знаю о вашей системе ...

  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 для расчета и представления ваших URL.Например ...

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-адреса запроса

    SELECT store_id, location_id FROM store_location_urls WHERE slug = ?
    

    Если при этом возвращается запись, вы можете затем запросить у таблиц stores и locations дополнительные данные, необходимые для отображения страницы (или даже просто присоединить их к исходному запросу).В противном случае используйте

    http_response_code(404);
    
  2. Получить все URL-слагы для определенного магазина

    SELECT slug FROM store_location_urls WHERE store_id = ?
    
  3. Аналогично, вы можете получить все URLslugs для определенного местоположения


Дополнительное примечание ... из-за конкатенации строк любые ваши индексы на stores.slug_stores и locations.slug_location будут бесполезны с вышеприведенным VIEW.Альтернатива состоит в том, чтобы использовать реальную производную таблицу (например, ту, которая у вас есть) и поддерживать ее с помощью триггеров.

0 голосов
/ 29 января 2019

Я предполагаю, что у вас нет id значений для JOIN ваших таблиц, и что у вас нет возможности создавать такие значения.В этом случае, поскольку комбинация вашего магазина / местоположения может быть такой короткой, как oneword-oneword, первое и последнее слова слага будут примерно такими же, как вы можете искать.Вы можете извлечь начальную и конечную части слага, используя SUBSTRING_INDEX и использовать его для сужения набора совпадений в каждой таблице до того, как попытаетесь сравнить всю строку.В моем примере я использую переменную SQL для хранения слага:

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, при условии, что такое хранилище существует.

Демо на dbfiddle

0 голосов
/ 29 января 2019

Я думаю, что вы можете запросить, как следующие в MySQL, и если после этого проверить PHP.Из вашего описания не похоже, что между этими таблицами возможно какое-либо объединение, поэтому, я думаю, требуется объединение.

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

...