Точные результаты при наличии SQL

#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. Вы правы, я изменил разделители. Хороший способ мышления, простой и хороший. работает хорошо, спасибо!