Pasha
12.10.2017
09:35:57
Добрый день, никто не сталкивался вот с таким
SELECT
*
FROM
someTable st0
WHERE
st0.field IN
(subQuery1)
AND
st0.field IN
(subQuery2)
возвращает пустоту хотя subQuery1 и subQuery2 возвращают одни и теж значения
Ринат
12.10.2017
09:41:16
эм
Google
Ринат
12.10.2017
09:41:38
а зачем два раза по одному и тому же полю?
SELECT
*
FROM
someTable st0
WHERE
st0.field IN
(subQuery1) так работает?
Pasha
12.10.2017
09:42:33
из-за того что запрос динамически строится кодом
да так работает
Yaroslav
12.10.2017
09:42:57
оно есть и в1 результате и во втором?
Pasha
12.10.2017
09:44:10
да есть
правда разные alias`ы у одной и той же таблицы
в subQuery1 это SELECT b1.id FROM books b1... а во втором это SELECT b2.id FROM books b2..
Yaroslav
12.10.2017
09:49:08
сделай where к каждому подзапросу, оба возвращают результат?
SELECT
*
FROM
someTable st0
WHERE
st0.field IN
(subQuery1)
и
SELECT
*
FROM
someTable st0
WHERE
st0.field IN
(subQuery2)
можно еще так
SELECT
*
FROM
someTable st0
WHERE
st0.field IN
(subQuery1
UNION
subQuery2)
поля правильные проверяешь и выводишь?
Google
Pasha
12.10.2017
09:55:34
да оба возвращают одно и тоже
Yaroslav
12.10.2017
09:56:15
Pasha
12.10.2017
09:59:25
да срабатывает
Yaroslav
12.10.2017
10:01:00
значит в каком-то из запросов нет такого результата
должно выводить если оба подзапроса имеют такое поле.
Nikolay
12.10.2017
17:43:56
Ребята, всю голову сломал уже, не могу сообразить каким образом можно решить проблему. Есть таблица
CREATE TABLE user_favorite (
user_id INT(10) NOT NULL,
post_id INT(10) NOT NULL
);
Нужно вывести пользователей у которых максимально количество общих постов
Уже всяко разно пробовал и группировку и вложенные селекты. Не могу сообразить как
Yaroslav
12.10.2017
17:44:45
что значит, максимальное количество общих постов?
если у вас связь много ко многому, то лучше добавить таблицу промежуточную
Nikolay
12.10.2017
18:02:54
это и есть промежуточная таблица
Yaroslav
12.10.2017
18:06:13
Nikolay
12.10.2017
18:17:14
ну например, есть три пользователя A, B и C. Пользователи A и B добавили в избранное посты 123, 124, 125, так же, пользователь B добавил посты 160, 170
так вот, мне нужно получить эти общие id постов, которые в примере 123, 124, 125 и их авторов A и B
lost
12.10.2017
18:18:53
Изи
Nikolay
12.10.2017
18:19:06
одним запросом?
lost
12.10.2017
18:19:15
Вообще легко
Nikolay
12.10.2017
18:19:20
Как?
lost
12.10.2017
18:20:29
Сначала group_concat постов с группировкой по юзерам
Nikolay
12.10.2017
18:20:30
давай я тебе даже sqlfiddle сделаю
а потом?
вот я с ним возился, никак не дошло куда дальше сконкатенированные id девать
lost
12.10.2017
18:21:04
Потом оборачиваешь это в подзапрос и группируешь юзеров по набору постов
Google
lost
12.10.2017
18:21:20
Правда вариант такое себе
Yaroslav
12.10.2017
18:21:22
Пересечение через select можно
lost
12.10.2017
18:22:14
Чтобы наборы айдишников были отсортированы и потом совпали все
Nikolay
12.10.2017
18:23:06
http://sqlfiddle.com/#!9/3f35c5/2/0
вот
lost
12.10.2017
18:25:31
Минут через 15 налячкаю
Если сам не разберешься
Nikolay
12.10.2017
18:26:47
постараюсь
ну короче это максимум что я смог )
http://sqlfiddle.com/#!9/3f35c5/9/0
lost
12.10.2017
18:55:03
http://sqlfiddle.com/#!9/3f35c5/12/0
только датасет который ты подобрал под этот запрос не очнь подходит
http://sqlfiddle.com/#!9/05f68e/1/0
Yaroslav
12.10.2017
19:05:35
lost
12.10.2017
19:06:34
группировка по строкам это плохая затея, писал об этом выше
на выборке в 10 строк можно и по варчарам группировать, а когда у тебя этих постов будет пару сотен тысяч... в общем грустно это будет
а так небольшой выйгрыш по скорости
Yaroslav
12.10.2017
19:07:49
понял
спасибо за обьяснение
lost
12.10.2017
19:13:56
единственное что нужно знать, что crc32 может давать коллизии в теории
как и хэшики от md5
Alexander
12.10.2017
20:46:03
Google
Alexander
12.10.2017
20:46:14
садись, два
lost
12.10.2017
20:48:56
Alexander
12.10.2017
20:58:17
оно на практике (коллизии) очень быстро и просто
для crc32
lost
12.10.2017
21:00:16
любители прикапываться к словам подоспели
если подгонять через какие-то алгоритмы, то может и быстро и просто, а речь шла о совпадении в запросе
Alexander
12.10.2017
21:08:13
для crc32 коллизии считались ещё во времена фидо
rocknrolla
15.10.2017
09:12:47
Народ ,подскажите, как будет выглядеть запрос , нужно скопировать из одной строки title , text ,where id=3 и вставить в другие строки где id =44,57,33,29
lost
15.10.2017
09:18:56
update foo f join (select title, text from foo2 where id = 3) as ff on true
set f.title = ff.title,
f.text = ff.text
where id IN (44,57,23,29)
rocknrolla
15.10.2017
09:47:44
спасибо!!!
большое
Илья
16.10.2017
07:43:50
Всем привет! Подскажите, как можно упростить вот такой запрос?
SELECT * FROM table WHERE concat_ws('', name, middleName, surName) LIKE '%cagejohn%'
UNION
SELECT * FROM table WHERE concat_ws('', surName, middleName, name) LIKE '%cagejohn%'
UNION
SELECT * FROM table WHERE concat_ws('', middleName, name, surName) LIKE '%cagejohn%'
UNION
SELECT * FROM table WHERE concat_ws('', surName, name, middleName) LIKE '%cagejohn%'
UNION
SELECT * FROM table WHERE concat_ws('', name, surName, middleName) LIKE '%cagejohn%'
UNION
SELECT * FROM table WHERE concat_ws('', middleName, surName, name) LIKE '%cagejohn%'
Yaroslav
16.10.2017
07:45:27
через оператор in
Илья
16.10.2017
07:45:30
суть в том, что я ввожу часть начало ФИО в любом порядке и должен получить результат поиска. John S Cage или S Cage John запросы должны вернуть одни и те же результаты
Yaroslav
16.10.2017
07:45:48
либо черезе like
Илья
16.10.2017
07:46:14
Yaroslav
16.10.2017
07:54:55
сделать в одном where
и лучше в бд хранить эти штуки по отдельности
а выводить конктинированные
Google
Yaroslav
16.10.2017
07:55:47
проще работать будет
Илья
16.10.2017
07:57:28
SELECT * FROM gjjbook_db.accounts WHERE
concat_ws('', name, middleName, surName) LIKE '%cagejohn%' OR
concat_ws('', surName, middleName, name) LIKE '%cagejohn%' OR
concat_ws('', name, surName, middleName) LIKE '%cagejohn%' OR
concat_ws('', middleName, surName, name) LIKE '%cagejohn%' OR
concat_ws('', middleName, name, surName) LIKE '%cagejohn%' OR
concat_ws('', surName, name, middleName) LIKE '%cagejohn%';
Yaroslav
16.10.2017
08:03:20
можно подзапросами
сначала ищешь surName
потом name, потом middleName
либо через join
тебе ж главное, чтоб была вся инфа, а последовательность роли не играет
Илья
16.10.2017
08:05:36