Выборка (valid = 6 and valid = 7 ... ) по одной колонке

Тема в разделе "Базы данных", создана пользователем 452, 31 авг 2010.

Статус темы:
Закрыта.
Модераторы: latteo
  1. 452

    452 Создатель

    Регистр.:
    16 авг 2007
    Сообщения:
    31
    Симпатии:
    0
    Подскажите как создать запрос который будет выводить список данных из таблицы которые имеют в `valid` значения
    Код:
    (`valid` = 6) or (`valid` = 9) or (`valid` = 14)
    , но не любое значение из найденных
    Код:
    (`valid` = 6) or (`valid` = 9) or (`valid` = 14) а (`valid` = 14)
    = нету такого а вывело только 6 и 9 без 14, нужно так чтобы либо выводило 6 9 и 14 вместе, либо ничего не возвращало, и еще в прикурку данные в поле `valid` и dataid повторяются нужно к томуже как то
    Код:
    (COUNT(DISTINCT dataid) = 3)
    прикрутить))
    ....................
    Код:
    SELECT id,dataid,valid
    FROM `tp_advenced_data` 
    WHERE (`valid` = 6) or (`valid` = 9) or (`valid` = 14)
    having count(*) = 3
    вот что уже успел найти
    как было бы проще наверное если бы можно было как то так все получить))
    Код:
    SELECT DISTINCT dataid,id,dataid,valid
    FROM `tp_advenced_data` 
    WHERE (`valid` = 6) AND (`valid` = 14)
    ....................
    Код:
    SELECT tp_advenced_data.id, tp_advenced_data.dataid, tp_advenced_data.valid
    FROM `tp_advenced_data` 
    WHERE `valid` 
    IN ( 2, 6, 9, 12, 14, 116 ) 
    GROUP BY dataid
    LIMIT 0 , 30
     
  2. chang

    chang

    Регистр.:
    20 ноя 2009
    Сообщения:
    364
    Симпатии:
    117
    3 раза прочитал но чет не въехал что нужно сделать ... или автор уже сам догадался как делать .....

    приведите текущие данные в таблице и то что вы хотите с них в результате получить ... а с запросом думаю поможем
     
  3. polyetilen

    polyetilen Заблокирован

    Регистр.:
    10 авг 2006
    Сообщения:
    814
    Симпатии:
    474
    как я понял тут у каждого dataid есть какие-то данные (2,6,9,12....)
    и надо найти только те dataid который состоит из данных например только (9,12)

    тогда найти такой dataid можно сгрупировав всё по dataid и сверив списки через GROUP_CONCAT
    Код:
    SELECT *, GROUP_CONCAT(DISTINCT valid ORDER BY valid ASC),
    IF(GROUP_CONCAT(DISTINCT valid ORDER BY valid ASC)='9,12',1,0) total_valid
    FROM tp_advenced_data
    GROUP BY dataid
    having total_valid=1
    
    и когда dataid известно, то через субзапрос вытаскиваем все данные с найденным dataid
    Код:
    SELECT *
    FROM tp_advenced_data
    WHERE dataid IN(
        SELECT dataid
        FROM tp_advenced_data
        GROUP BY dataid
        having IF(GROUP_CONCAT(DISTINCT valid ORDER BY valid ASC)='9,12',1,0)=1
    )
    
    будет
    3 2 9
    4 2 12
     
  4. 452

    452 Создатель

    Регистр.:
    16 авг 2007
    Сообщения:
    31
    Симпатии:
    0
    да, нужно будто отфильтровать по valid,
    нужно отобразить отфильтровать записи (их много) которые подпадают под
    условие выбора с бд, valid = 6 и valid = 9 и valid = 14
    их найдено например 20 штук и все они повторяются... несколько значений 6 может быть в поле valid
    потом по полю dataid удаляем дубликаты
    так как (valid = 6 и valid = 9) - не повторяющиеся то есть два раза 6 не может быть для одного dataid
    вот этот код так и делает
    Код:
    SELECT tp_advenced_data.id, tp_advenced_data.dataid, tp_advenced_data.valid
    FROM `tp_advenced_data` 
    WHERE `valid` 
    IN ( 2, 6, 9, 12, 14, 116 ) 
    GROUP BY dataid
    LIMIT 0 , 30
    а проблема вся лишь в том что выводится любое что найдено из списка IN ( 2, 6, 9, 12, 14, 116 ) и даже когда нет в поле значения 116, а так не подходит, нужно чтобы если хотя бы одного из значений нет (116) в `valid` то не выводился результат вообще
     
  5. polyetilen

    polyetilen Заблокирован

    Регистр.:
    10 авг 2006
    Сообщения:
    814
    Симпатии:
    474
    проверить существует ли значение можно таким запросом
    Код:
    SELECT 1 group_all
    FROM tp_advenced_data
    WHERE valid IN (2,6,9,12,14) 
    GROUP BY group_all
    having IF(GROUP_CONCAT(DISTINCT valid ORDER BY valid ASC)='2,6,9,12,14',1,0)=1
    
    все (2,6,9,12,14) есть, значит ответ будет 1, но если
    Код:
    SELECT 1 group_all
    FROM tp_advenced_data
    WHERE valid IN (2,6,9,12,14,116) 
    GROUP BY group_all
    having IF(GROUP_CONCAT(DISTINCT valid ORDER BY valid  ASC)='2,6,9,12,14,116',1,0)=1
    
    то ответ будет пустой, в запросе все значения групируются в строку и сортируются по увеличению и результат должен совпадат с текстом '2,6,9,12,14,116' если не совпадает то ничего не возвращает, значит нет какого-то значения.

    Дальше всё подставить в запрос
    Код:
    SELECT *
    FROM tp_advenced_data 
    WHERE valid IN (2,6,9,12,14,116) AND (
        SELECT 1 group_all
        FROM tp_advenced_data
        WHERE valid IN (2,6,9,12,14,116) 
        GROUP BY group_all
        having IF(GROUP_CONCAT(DISTINCT valid ORDER BY valid ASC)='2,6,9,12,14,116',1,0)=1
    )=1
    GROUP BY dataid
    LIMIT 0,30
    
    получится пусто, а если 116 везде убрать то будет список.
     
    452 нравится это.
  6. 452

    452 Создатель

    Регистр.:
    16 авг 2007
    Сообщения:
    31
    Симпатии:
    0
    благодарю, вроде бы таки так и должно было быть=)
    остается теперь оптимизировать запрос, и поискать его аналог, или другой более компактный способ реализации=)
    сейчас еще проведу объединение с другой таблицей чтобы получить описание найденного то есть title
    благодарю Вас всех за помощь
     
  7. polyetilen

    polyetilen Заблокирован

    Регистр.:
    10 авг 2006
    Сообщения:
    814
    Симпатии:
    474
    так надо сделать наоборот, сначала сгрупировать по dataid и найти нужные dataid для которых есть все элементы, мой первый пост как раз это и делал, надо только добавить групировку по dataid
    Код:
    SELECT *
    FROM tp_advenced_data
    WHERE dataid IN(
        SELECT dataid
        FROM tp_advenced_data
        GROUP BY dataid
        having IF(GROUP_CONCAT(DISTINCT valid ORDER BY valid ASC)='2,6,14',1,0)=1
    )
    GROUP BY dataid
    
     
    452 нравится это.
  8. 452

    452 Создатель

    Регистр.:
    16 авг 2007
    Сообщения:
    31
    Симпатии:
    0
    Тода Раба, Благодарю, Шукран=)
     
Статус темы:
Закрыта.