#mysql #sql
#mysql #sql
Вопрос:
Итак, я пытаюсь получить точные результаты с помощью функции, и я пробовал много способов, но безуспешно.
История в том, что у меня есть этот SQL-запрос:
SELECT
SQL_CALC_FOUND_ROWS customers.*,
GROUP_CONCAT(fieldsContent.Content SEPARATOR '%||%') AS Content,
GROUP_CONCAT(fieldsContent.FieldID SEPARATOR '%||%') AS FieldID,
customers.Created,
customers.ID
FROM (`customers`)
LEFT OUTER JOIN `fieldsContent` ON `fieldsContent`.`TypeID` = `customers`.`ID`
HAVING Content LIKE "%2%" AND LIKE "%new%"
GROUP BY `fieldsContent`.`TypeID`
ORDER BY `customers`.`Created` DESC
Результат:
stdClass Object
(
[ID] => 4857
[Created] => 1403714637
[Content] => newman%||%noman%||%newemail@gmail.com%||%92292%||%old%||%7
[FieldID] => C359FE4B-7A5B-689F-8A26-D030CFC65475%||%E34399EB-0509-2F00-EAD1-38753FCAEA5C%||%3172E7F4-B445-2F7A-74C8-F9C9E85A4C22%||%26D87695-D9F4-9E2F-2BA7-753FBF3E0BBA%||%E443B0BD-5283-CD02-F569-3B05B615B5BC%||%979C2844-870F-961F-FA28-12AC615346E5
)
stdClass Object
(
[ID] => 175997
[Created] => 1403714632
[Content] => john%||%doe%||%google@gmail.com%||%0847%||%new%||%2
[FieldID] => C359FE4B-7A5B-689F-8A26-D030CFC65475%||%E34399EB-0509-2F00-EAD1-38753FCAEA5C%||%3172E7F4-B445-2F7A-74C8-F9C9E85A4C22%||%26D87695-D9F4-9E2F-2BA7-753FBF3E0BBA%||%E443B0BD-5283-CD02-F569-3B05B615B5BC%||%979C2844-870F-961F-FA28-12AC615346E5
)
Проблема в том, что мне нужен только второй результат, только там, где у меня есть слово «новый» и «2»,
а не там, где слово «новый» выглядит как newman, а число 2 выглядит как «92292».
Поэтому мне нужен только второй результат, а не первый.
Главное, что я точно знаю, после какого разделителя будет слово «новый», а «2» будет, и я понятия не имею, как его применить, потому что «новый» всегда будет после 4-го разделителя, а «2» будет после 5-го разделителя.
Есть сумасшедшие идеи, как решить эту проблему? Спасибо!
Комментарии:
1. Зачем использовать having вместо where? Кроме того, всегда ли new обертывается знаками процентиля в фактическом тексте?
2. @SpectralGhost, потому что where — это не вариант. мне нужна вся длина
Content
столбца, и если я это сделаюwhere
, это уничтожит мою группу по всем данным, которые мне нужно получить3. Что это за разновидность SQL? MySQL?
4. Использование% как части разделителя — действительно плохая идея для SQL
5. Вы пробовали заменить
HAVING Content LIKE "%2%" AND LIKE "%new%"
наHAVING Content IN ("2","new")
, если хотите точных совпадений?
Ответ №1:
Измените это:
HAVING Content LIKE "%2%" AND LIKE "%new%"
К этому:
HAVING Content LIKE "%%2" ESCAPE "" AND LIKE "%%new%%" ESCAPE ""
Это предполагает, что вы ищете 2 в конце строки для fieldId «979C2844-870F-961F-FA28-12AC615346E5». Если вам нужно, чтобы он был более гибким, вы можете захотеть изменить это на предложение where (которое не разрушит группировку) и выбрать пары fieldId / Content специально во вложенных запросах.
Кроме того, я предлагаю использовать другой разделитель, поэтому вам не нужно выполнять экранирование с помощью like .
Комментарии:
1. Вы правы, я изменил разделители. Хороший способ мышления, простой и хороший. работает хорошо, спасибо!