powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Сложный запрос
23 сообщений из 23, страница 1 из 1
Сложный запрос
    #38801897
smala
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
table1
id name
1 'bla bla bla'
2 'bla2 bla2 bla2'

table2
id, on_id, tag_key, val
1 1 '543dc43df3cf5aea67cf59650142ae36' 'Полтавська'
2 1 '345805b88b9ca1e189fa11ea817e5666' 'ФО'
3 2 '543dc43df3cf5aea67cf59650142ae36' 'Полтавська'
4 2 '345805b88b9ca1e189fa11ea817e5666' 'ФА'


SELECT `table1` . * FROM (`table1`) LEFT JOIN `table2` ON `table2`.`on_id` = `table1`.`id`

WHERE(

(`table2`.`tag_key` = '543dc43df3cf5aea67cf59650142ae36' AND `table2`.`val` IN('Полтавська'))

AND

(`table2`.`tag_key` = '345805b88b9ca1e189fa11ea817e5666' AND `table2`.`val` IN('ФО'))

)

этот кусок не срабатывает, помогите пожалуйста.


не срабатывает из за того что `tag_key` = '543dc43df3cf5aea67cf59650142ae36' и `tag_key` = '345805b88b9ca1e189fa11ea817e5666'

а мне надо выбрать где именно совпадают эти 2 строки к одному результату. как быть ?

тоесть мне в результате должна получится только 2 строка с таблици table1 id: 1

P.S. извините за несовсем понятное обьяснение, я старался как мог ...
...
Рейтинг: 0 / 0
Сложный запрос
    #38801904
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
smalaэтот кусок не срабатываетПотому что вы пытаетесь найти записи, в которых одновременно

`tag_key` = '543dc43df3cf5aea67cf59650142ae36'
И
`tag_key` = '345805b88b9ca1e189fa11ea817e5666'

Буквально сегодня похожая тема была, почитайте.
...
Рейтинг: 0 / 0
Сложный запрос
    #38801918
smala
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
это я понял, я прошу решения как быть в таком случае если мне надо так выбрать, а в одном случае tag_key такой а в другом другой
...
Рейтинг: 0 / 0
Сложный запрос
    #38801927
smala
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
tanglir, подскажите ссылку на тему, ищу щас пока не нахожу
...
Рейтинг: 0 / 0
Сложный запрос
    #38801931
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
smalaя прошу решения
tanglirБуквально сегодня похожая тема была, почитайте
...
Рейтинг: 0 / 0
Сложный запрос
    #38801963
smala
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
тоесть мне использовать -> having sum(tag in (1,3)) ???? такого плана что то ?
...
Рейтинг: 0 / 0
Сложный запрос
    #38801991
alex564657498765453
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
плин...та у тебя ошибка в запросе...

тебе сказали, ты ищешь запись в таблице где одно поле равно разным значениям...

я читал твой ответ...ты на листике себе нарисуй, какой результат должна выдать база...
допустим она както сделала что ты хочешь...в столбике хеша она какое из двух значений должна выдать???



ЗЫ
как на рисуешь, и возникнет вопрос что делать - джоин
...
Рейтинг: 0 / 0
Сложный запрос
    #38802001
smala
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
(`otvets`.`tag_key`, `otvets`.`val`)
IN
(
('543dc43df3cf5aea67cf59650142ae36', 'Полтавська'),
('345805b88b9ca1e189fa11ea817e5666','ФО')
)

такое тоже не срабатывает
...
Рейтинг: 0 / 0
Сложный запрос
    #38802010
smala
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
я понимаю в чем проблемма, но как мне ее обойти, запрос у меня правильный и не вяжется только в этом моменте я его весь сюда не выкладывал
...
Рейтинг: 0 / 0
Сложный запрос
    #38802017
smala
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
smala(`otvets`.`tag_key`, `otvets`.`val`)
IN
(
('543dc43df3cf5aea67cf59650142ae36', 'Полтавська'),
('345805b88b9ca1e189fa11ea817e5666','ФО')
)

такое тоже не срабатывает


это выводит все совпадения где есть или ('543dc43df3cf5aea67cf59650142ae36', 'Полтавська') или ('345805b88b9ca1e189fa11ea817e5666','ФО')

а мне надо только то где есть ('543dc43df3cf5aea67cf59650142ae36', 'Полтавська') И ('345805b88b9ca1e189fa11ea817e5666','ФО')
...
Рейтинг: 0 / 0
Сложный запрос
    #38802018
alex564657498765453
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НАПИШИ каким должен быть ответ!
...
Рейтинг: 0 / 0
Сложный запрос
    #38802021
smala
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вот я и похожее нашел http://prntscr.com/558lbb
поэтому и спрашиваю не HAVING юзать?
...
Рейтинг: 0 / 0
Сложный запрос
    #38802023
smala
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alex564657498765453,

table1
id name
1 'bla bla bla'
2 'bla2 bla2 bla2'

table2
id, on_id, tag_key, val
1 1 '543dc43df3cf5aea67cf59650142ae36' 'Полтавська'
2 1 '345805b88b9ca1e189fa11ea817e5666' 'ФО'
3 2 '543dc43df3cf5aea67cf59650142ae36' 'Полтавська'
4 2 '345805b88b9ca1e189fa11ea817e5666' 'ФА'


в ответе нужен table1 1 'bla bla bla'

)))))
...
Рейтинг: 0 / 0
Сложный запрос
    #38802040
smala
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
smala,

Код: sql
1.
SELECT `vizits`.* FROM (`vizits`) LEFT JOIN `projects` ON `projects`.`id`=`vizits`.`project_id` LEFT JOIN `otvets` ON `otvets`.`vizit_id`=`vizits`.`id` AND `otvets`.`last`=1 WHERE `projects`.`name` IN ('КРЕДІ АГРІКОЛЬ', 'Фокстрот') AND (((`vizits`.`project_id` = 324 AND `otvets`.`tag_key` = '543dc43df3cf5aea67cf59650142ae36' AND `otvets`.`val` IN('Полтавська')) AND (`vizits`.`project_id` = 324 AND `otvets`.`tag_key` = '345805b88b9ca1e189fa11ea817e5666' AND `otvets`.`val` IN('ФО'))) OR (`vizits`.`project_id` = 258 AND `otvets`.`tag_key` = '5f04973bace196f3c0a519f33a1a3dba' AND `otvets`.`val` IN('ЦРУ','ЮРУ'))) AND `vizits`.`status` = 9 AND `vizits`.`type` = 0 GROUP BY `vizits`.`id` ORDER BY `vizits`.`date_vizit` desc LIMIT 30
...
Рейтинг: 0 / 0
Сложный запрос
    #38802078
smala
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ну подскажи в какую сторону копать хоть
...
Рейтинг: 0 / 0
Сложный запрос
    #38802417
smala
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
SELECT `vizits`.* FROM (`vizits`) 

LEFT JOIN `projects` ON `projects`.`id`=`vizits`.`project_id` 
LEFT JOIN `otvets` ON `otvets`.`vizit_id`=`vizits`.`id` AND `otvets`.`last`=1 

WHERE `projects`.`name` IN ('КРЕДІ АГРІКОЛЬ') 
AND 




(

	(`vizits`.`project_id` = 324 
         AND  
   (`otvets`.`tag_key`, `otvets`.`val`) 
          IN 
   ( 
       ('543dc43df3cf5aea67cf59650142ae36', 'Полтавська'),
       ('543dc43df3cf5aea67cf59650142ae36', 'Дніпропетровська'),
       ('345805b88b9ca1e189fa11ea817e5666','ФО')
    ))
    OR 
	(`vizits`.`project_id` = 258 
         AND  
   (`otvets`.`tag_key`, `otvets`.`val`) 
          IN 
   ( 
       ('5f04973bace196f3c0a519f33a1a3dba', 'ЦРУ'),
       ('5f04973bace196f3c0a519f33a1a3dba', 'ЮРУ')
    ))
   
 )

AND `vizits`.`status` = 9 AND `vizits`.`type` = 0 GROUP BY `vizits`.`id` HAVING COUNT(DISTINCT `otvets`.`tag_key`)=2 ORDER BY `vizits`.`date_vizit` desc LIMIT 30




вот интересует как быть в этом месте
(DISTINCT `otvets`.`tag_key`)=2 -> если в одном условии уникальных ключа 2 а в другом один ???????
...
Рейтинг: 0 / 0
Сложный запрос
    #38802552
smala
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
SELECT  `vizits` . * 
	FROM (
		`vizits`
	)
	LEFT JOIN  `projects` ON  `projects`.`id` =  `vizits`.`project_id` 
	LEFT JOIN  `otvets` ON  `otvets`.`vizit_id` =  `vizits`.`id` 
		WHERE  `projects`.`name` 
			IN 
		( 'КРЕДІ АГРІКОЛЬ' ) 
			AND 

		( `vizits`.`project_id` =324
			AND 
			(
				(`otvets`.`tag_key` =  '543dc43df3cf5aea67cf59650142ae36'
					AND  
				`otvets`.`val` IN ('Полтавська'))
					AND
				(`otvets`.`tag_key` =  '345805b88b9ca1e189fa11ea817e5666'
					AND  
				`otvets`.`val` IN ('ФО'))
			)

AND  `vizits`.`status` =9
AND  `vizits`.`type` =0
GROUP BY  `vizits`.`id` 
ORDER BY  `vizits`.`date_vizit` DESC 
LIMIT 30



я уже вот какой пример придумал, вот по сути вот такая мне нада выборка, а не работает из за разных tag_key
...
Рейтинг: 0 / 0
Сложный запрос
    #38802883
alex564657498765453
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
СОВЕТ вкачестве ПыСы

перестань пытаться решить задачу галопом.

решай почучуть.

например, мне надо из таблицы юзеров ! стоп!
select * from users;

смотрим...вот что имеем вначале - все юзеры.

дальше - из таблицы юзеров найти тех, у которых среди домашних животных ! стоп

select * from users u left join animals a on (u.id = a.user_id)

смотрим - то что надо, связались данные

у которых среди домашних животных есть одновременно кот и собака !стоп

сначала просто кот
select * from users u left join animals a on (u.id = a.user_id)
where a.type='cat'

Отдельно собака
select * from users u left join animals a on (u.id = a.user_id)
where a.type='dog'

нам надо ито ито, это часть илито или то.
берём попроще
select * from users u left join animals a on (u.id = a.user_id)
where a.type='cat' or a.type='dog'

смотрим...ага, юзеры с собакой встречаються ввиде записи вася ....собака гавчик
с котом - юля кот мурчик...

ис собакой и с котом ввиде

толя кот мяукалка...
толя собака кусачка...

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

select u.id,count(*) from users u left join animals a on (u.id = a.user_id)
where a.type='cat' or a.type='dog'
group by u.id

тааак, и теперь оставить тех что дважды

select u.id,count(*) from users u left join animals a on (u.id = a.user_id)
where a.type='cat' or a.type='dog'
group by u.id
having count(*) = 2;

вроде как вышло... на сразу ясно что хе%%ня вышла. - а что если у человека не кот и собака, а две собаки? тоже ведь дважды встретиться (связь один юзер к многим животным домашним)

вот групировка канает, если бы мы имели результат ввиде

юля кот
вася собака
толя собака
толя кот

тоесть на каждую пару юзер - тип животного была бы одна запись, про сам факт, у юзера А есть хотябы одно живтное типа Б

как получить такое

select DISTINCT u.id,a.type
from users u left join animals a on (u.id = a.user_id)
where a.type='cat' or a.type='dog'

оооо
дальше понятно как.

select id,count(*) from
(
select DISTINCT u.id as id,a.type as type
from users u left join animals a on (u.id = a.user_id)
where a.type='cat' or a.type='dog'
)

group by id having count(*) =2

ооо.

ну блин чтото сложновато. анука гугли - пощитать количество уникальных записей

опа.
переписываем что нашли гуглом.

select u.id, count(distinct a.type)
from users u left join animals a on (u.id = a.user_id)
where a.type='cat' or a.type='dog'
group by u.id having count(distinct a.type) =2

таак.

а можно ли его ускорить, а то мы выбираем всё, потом ищем уникальные...

чтобы придумать.

вообще сразу смущает - а накой мы тащим таблицу юзеров, если используем только айди
который есть в таблице животных ввиде внешнего ключа

так переписываем
select a.user_id,count(distinct a.type)
from animals a
where a.type = 'dog' or a.type = 'cat'
group by a.user_id having count(distinct a.type) = 2

о!

но всёрано мудяцки... выборка полная а потом искать уникальные..всмысле мы вибараем и тех что по одному животному имеют(либо кот либо собака) - а накой они нам...вот бы сразу
...

опа - идея, а что если джоинить саму к себе таблицу???

selelct * from animals a1 join animals a2 on (a2.user_id = a1.user_id)
where a1.type = 'cat' and a2.type = 'dog'


ооо чтото ближе. если сделать индексы на поле тип животного, оно по одному индексу найдёт кошатников, по этому же индексу но для "другой" таблицы собачатников, и там и там получит список записей и найдёт те где один и тотже юзер

подустал писать...

вообщем сделав запрос получим для заядлых животноводов кучу записей - на каждую пару собака -кот
если у человека 5 котов и 3 собаки - 3*5 = 15 записей

ну и тут приходит на ум отработаный дистинкт.

====
писал наспех, но чтоб показать - не надо пытаться сразу сделать, если не получаеться... иди потихоньку.
...
Рейтинг: 0 / 0
Сложный запрос
    #38803072
smala
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alex564657498765453,

авторвообщем сделав запрос получим для заядлых животноводов кучу записей - на каждую пару собака -кот
если у человека 5 котов и 3 собаки - 3*5 = 15 записей

но мне получается надо найти 5 котов 3 собаки из приюта 1, и 4 кота 1 собака из приюта 2)) вот в таком случае я незнаю какой писать дистинкт, пробовал сумму уникальных значенний ключа, никак, а для одного приюта правильно работает))

ну Спасибо оч все расписали, думаю у меня получится собрать то что надо.


вот я использовал дистинкт

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
(

	(
		`vizits`.`project_id` = 324 
         		AND  
   			(`otvets`.`tag_key`, `otvets`.`val`) 
          		IN 
		   		( 
			       ('543dc43df3cf5aea67cf59650142ae36', 'Полтавська'),
			       ('543dc43df3cf5aea67cf59650142ae36', 'Дніпропетровська'),
			       ('345805b88b9ca1e189fa11ea817e5666','ФО')
		    	)

   )
    OR 
	(`vizits`.`project_id` = 258 
         AND  
   (`otvets`.`tag_key`, `otvets`.`val`) 
          IN 
   ( 
       ('5f04973bace196f3c0a519f33a1a3dba', 'ЦРУ'),
       ('5f04973bace196f3c0a519f33a1a3dba', 'ЮРУ')
    )
   )
   
 )



а в конце запроса пишется
Код: sql
1.
HAVING COUNT(DISTINCT `otvets`.`tag_key`)=3




3 это количество уникальных ключей, если взять только половину запроса

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
`vizits`.`project_id` = 324 
         		AND  
   			(`otvets`.`tag_key`, `otvets`.`val`) 
          		IN 
		   		( 
			       ('543dc43df3cf5aea67cf59650142ae36', 'Полтавська'),
			       ('543dc43df3cf5aea67cf59650142ae36', 'Дніпропетровська'),
			       ('345805b88b9ca1e189fa11ea817e5666','ФО')
		    	)



тут имеется 2 уникальных ключа 543dc43df3cf5aea67cf59650142ae36 и 345805b88b9ca1e189fa11ea817e5666
если прописать
Код: sql
1.
HAVING COUNT(DISTINCT `otvets`.`tag_key`)=2


то все правильно срабатывает, но при полном запросе когда в одном варианте 2 уникальных значения, в другом 1. какой дистинкт писать непонятно, сумма не помогла.

надо походу join ить пытатся таблици, причем получается столько раз сколько мне надо указать разных tag_key
...
Рейтинг: 0 / 0
Сложный запрос
    #38803400
smala
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
У МЕНЯ ВЫШЛО УРА!))))) вот такой вот вариант в моем случае подходит

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
SELECT `vizits`.* FROM (`vizits`) 
LEFT JOIN `projects` ON `projects`.`id`=`vizits`.`project_id` 
LEFT JOIN `projects_locations` ON `projects_locations`.`id`=`vizits`.`location_id` 

LEFT JOIN `otvets` AS `tag_878` ON `tag_878`.`vizit_id`=`vizits`.`id` AND `tag_878`.`last`=1 AND `tag_878`.`tag_key` = '99b9be3f1aabe0771df7fa85e7a736ad' 
LEFT JOIN `otvets` AS `tag_332` ON `tag_332`.`vizit_id`=`vizits`.`id` AND `tag_332`.`last`=1 AND `tag_332`.`tag_key` = '069c9cb17c0aca1e499f3a00fdeb9b3a' 
LEFT JOIN `otvets` AS `tag_334` ON `tag_334`.`vizit_id`=`vizits`.`id` AND `tag_334`.`last`=1 AND `tag_334`.`tag_key` = 'f296853a9e94b33af1457dac29cfed5a' 
LEFT JOIN `otvets` AS `tag_335` ON `tag_335`.`vizit_id`=`vizits`.`id` AND `tag_335`.`last`=1 AND `tag_335`.`tag_key` = '23862f44d4175145d06565c9586562d9' 

WHERE `projects`.`name` IN ('КРЕДІ АГРІКОЛЬ', 'Фокстрот') 

AND 
  (
    (
      (`vizits`.`project_id` = 324 AND (`projects_locations`.`locnum` IN('CK00','CK02','CK03','CN00','CN01'))) 
        AND 
      (`vizits`.`project_id` = 324 AND `tag_878`.`val` IN('Кредит «Свобода»','Автокредит','Депозит ФО'))
    ) 
      OR 
    (
      (`vizits`.`project_id` = 258 AND `tag_332`.`val` IN('Чернигов','Одесса','Кишинев')) 
        AND 
      (`vizits`.`project_id` = 258 AND `tag_334`.`val` IN('36-60')) 
        AND 
      (`vizits`.`project_id` = 258 AND `tag_335`.`val` IN('Компьютерная техника','Мелкая бытовая техника'))
    )
  ) 
AND `vizits`.`status` = 9 
AND `vizits`.`type` = 0 
GROUP BY `vizits`.`id` 
ORDER BY `vizits`.`date_vizit` 
desc LIMIT 30
...
Рейтинг: 0 / 0
Сложный запрос
    #38803414
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
smala, не вчитывался, но это
Код: sql
1.
2.
3.
(`vizits`.`project_id` = 324 AND (`projects_locations`.`locnum` IN('CK00','CK02','CK03','CN00','CN01'))) 
  AND 
(`vizits`.`project_id` = 324 AND `tag_878`.`val` IN('Кредит «Свобода»','Автокредит','Депозит ФО'))

явно аналогично такому:
Код: sql
1.
2.
3.
4.
5.
6.
7.
(
 `vizits`.`project_id` = 324 
 AND 
 `projects_locations`.`locnum` IN('CK00','CK02','CK03','CN00','CN01')
 AND 
 `tag_878`.`val` IN('Кредит «Свобода»','Автокредит','Депозит ФО')
)

Не стоит усложнять условия, если этого можно избежать.
...
Рейтинг: 0 / 0
Сложный запрос
    #38803606
smala
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
да, согласен, но мне так удобней получается, запрос собирается в цикле, динамически, множество условий, все такое, так что пусть уже так будет )) работает и отлично)))
...
Рейтинг: 0 / 0
Сложный запрос
    #38803617
smala
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
как видите что это выводится в одном месте цикла)))
Код: sql
1.
2.
3.
4.
5.
      (`vizits`.`project_id` = 258 AND `tag_332`.`val` IN('Чернигов','Одесса','Кишинев')) 
        AND 
      (`vizits`.`project_id` = 258 AND `tag_334`.`val` IN('36-60')) 
        AND 
      (`vizits`.`project_id` = 258 AND `tag_335`.`val` IN('Компьютерная техника','Мелкая бытовая техника'))


и этот
Код: sql
1.
      (`vizits`.`project_id` = 324 AND `tag_878`.`val` IN('Кредит «Свобода»','Автокредит','Депозит ФО'))




в общем потом уже буду оптимизацию проводить))
...
Рейтинг: 0 / 0
23 сообщений из 23, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Сложный запрос
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]