2014-03-14 3 views
0

Просьба предложить, как получить определенную строку из столбца без использования подобного запроса. пример.Mysql содержит строку, чтобы получить определенную строку в столбце

Имя таблицы уведомление
coulumn1: notificationid
column2: notification_to_id

notificationid  notification_to_id 
    1      25,23 
    2      15,16,25 

как получить только 25 строку одна из notification_to_id колонки

+4

несколько значений в одном столбце ... те неправильную нормализацию !! каждый столбец должен быть нормализован, чтобы содержать только одно значение! – NoobEditor

+0

@ shalini, вы имеете в виду, что хотите получить максимальное значение? – codelover

+0

Нет, не максимальное значение Мне нужно найти конкретную строку @codelover – Thaya

ответ

2

попробовать это один

SELECT notificationid, 
     SUBSTRING_INDEX(SUBSTRING_INDEX(CONCAT(notification_to_id,','),',',value.v),',',-1) as to_id 
FROM notification,(SELECT 1 as v UNION 
        SELECT 2 UNION 
        SELECT 3 UNION 
        SELECT 4 UNION 
        SELECT 5)value 
HAVING to_id = '25' 

sqlFiddle

Таким образом, запрос выбирает каждый элемент в поле CSV с помощью SUBSTRING_INDEX с value.v, который будет где-то от 1 до максимального 5 в этом случае (, заданной UNION из SELECT 1 ... SELECT 5). Если он содержит только 3 элемента в поле csv, когда value.v - 4 или 5, он возвращает пустую строку ''. И having должен возвращать строки, у которых есть 25 как элемент.

Если notification_to_id содержит более 5 элементов, просто добавьте еще UNION как SELECT 6 и так далее до максимального количества элементов в этой колонке.

другой способ заключается в использовании REGEX, как показано ниже (но у вас есть много вхождений 25 заменить

SELECT notificationid, 
     '25' as value 
FROM notification 
WHERE notification_to_id REGEXP '(^25$)|(^25,)|(,25$)|(,25,)' 

sqlfiddle

выше запрос будет совпадать, если 25 является единственным элементом (^ 25 $)^отмечает начало строки $ mark end of string. ИЛИ если 25 - первый элемент (^ 25,) ИЛИ если 25 - последний элемент (, 25 $) ИЛИ если 25 находится где-то посередине (, 25)

Или, если вы хотите использовать LIKE, вы используете приведенные ниже

SELECT notificationid, 
     '25' as value 
FROM notification 
WHERE notification_to_id LIKE '25' 
    OR notification_to_id LIKE '25,%' 
    OR notification_to_id LIKE '%,25' 
    OR notification_to_id LIKE '%,25,%' 

sqlFiddle

+0

ммммм .... забота, объясняющая, что происходит в этом 'sql' ... выглядит ракета-наука для меня !!! ??? :) – NoobEditor

+0

да ... я был прав ... это конечно ракетостроение !! : D – NoobEditor

+0

не это не просто хак, чтобы обойти ненормализованные данные –

Смежные вопросы