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

Статус
В этой теме нельзя размещать новые ответы.

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
 
3 раза прочитал но чет не въехал что нужно сделать ... или автор уже сам догадался как делать .....

приведите текущие данные в таблице и то что вы хотите с них в результате получить ... а с запросом думаю поможем
 
как я понял тут у каждого 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
 
да, нужно будто отфильтровать по 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` то не выводился результат вообще
 
проверить существует ли значение можно таким запросом
Код:
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
благодарю, вроде бы таки так и должно было быть=)
остается теперь оптимизировать запрос, и поискать его аналог, или другой более компактный способ реализации=)
сейчас еще проведу объединение с другой таблицей чтобы получить описание найденного то есть title
благодарю Вас всех за помощь
 
так надо сделать наоборот, сначала сгрупировать по 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
Тода Раба, Благодарю, Шукран=)
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху