Итак, я пытаюсь выбрать все строки, содержащие строку, равную значениям из другой таблицы.
SELECT q.QUERY, f.ANONID
FROM FACTS f
INNER JOIN QUERYDIM q
ON f.QUERYID = q.ID
WHERE q.QUERY IN (SELECT city FROM zipcodes);
Q.QUERY — это строка разной длины. Я хочу выбрать все q.QUERY, которые содержат значение, равное любому значению в городе
Пример
one row:
q.QUERY = "this is a city called berlin"
Другой ряд:
q.QUERY = "in cairo it is nice"
SELECT city FROM zipcodes = ("berlin","Birmingham","Huntsville",etc..)
Поэтому каждый q.QUERY каждый раз перебирает все города в таблице
Я пытаюсь найти все строки со значениями города
Вы можете использовать оператор LIKE и полное соединение с почтовыми индексами.
SELECT q.QUERY, f.ANONID
FROM FACTS f
INNER JOIN QUERYDIM q ON f.QUERYID = q.ID
INNER JOIN ( SELECT city FROM zipcodes ) t on q.query like concat('%',t.city, '%');
Ответ обновлен .. mysql не использует полное соединение
Я истек. q.query примерно 100 тысяч. может быть проблема в том, что таблица zicodes имеет несколько столбцов
Что-то вроде этого, если вы не хотите дублировать строки, если столбец запроса содержит несколько городов:
select q.query, f.anonid
from facts f
inner join querydim q on f.queryid = q.id
where exists (select 1 from zipcodes where locate(city, q.query));
Функция locate ищет первую строку во второй строке, возвращая индекс, если она найдена, ноль в противном случае и ноль преобразуется в ложь.
Я истек. q.query примерно 100 тысяч. может быть проблема в том, что таблица zicodes имеет несколько столбцов
Нет, запрос довольно тяжелый, так как он должен проверять каждый город в почтовых индексах для каждого запроса...
Должен ли полный присоединиться, присоединиться к чему-то?