Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / SQL запрос / 25 сообщений из 27, страница 1 из 2
22.11.2015, 13:49:32
    #39110132
Skillsoft
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL запрос
Здравствуйте. Скажите, пожалуйста, как составить SQL запрос (с подзапросами или без) чтобы выбрать все строки, в которые входят подстроки.

Например:
У меня есть таблица

id name user_id
-------------------
1 imya 1 5 3 7 25
2 imya2 5 6 3 4 8 11
3 imya3 2 7 9 4 6 100
...

Как мне выбрать записи, в которых в колонке user_id есть цифра 4 (точнее id этих записей)

Заранее спасибо
...
Рейтинг: 0 / 0
22.11.2015, 14:28:18
    #39110170
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL запрос
Код: sql
1.
WHERE LOCATE(' 4 ', CONCAT(' ',user_id, ' '))


Но разумнее нормализовать данные.
...
Рейтинг: 0 / 0
22.11.2015, 14:35:39
    #39110179
Skillsoft
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL запрос
Akina,

А как лучше хранить подобные данные? Есть некое имя, по клику на которое записывается ID пользователя который кликнул по этому имени.
...
Рейтинг: 0 / 0
22.11.2015, 15:27:27
    #39110234
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL запрос
Храни пары (name, user_id). Соответственно каждое отдельное поле дубли разрешает, а насчёт пары - думай сам, можно или нет. Если нет - то уникальный индекс на эту пару.
...
Рейтинг: 0 / 0
22.11.2015, 15:38:15
    #39110243
Skillsoft
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL запрос
Akina,

Например, если имен будет 10, а пользователей 100, и каждый пользователь кликнет по каждому имени. В итоге получится 1000 записей. Не много ли?
...
Рейтинг: 0 / 0
22.11.2015, 19:47:04
    #39110420
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL запрос
Skillsoft1000 записей. Не много ли?
Вот когда количество записей превысит десять миллионов, можно будет начинать беспокоиться.
...
Рейтинг: 0 / 0
22.11.2015, 19:52:29
    #39110422
Skillsoft
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL запрос
Спасибо большое!
...
Рейтинг: 0 / 0
22.11.2015, 20:03:41
    #39110430
Skillsoft
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL запрос
А тогда вот такой вопрос.

Я сделал таблицу

id - уникальные значения
name - не уникальные значения
user_id - не уникальные значения

Далее, по клику пользователя добавляю значение name=user_id (надеюсь правильно понял ваш совет)

получилась таблица
id name user_id
1 imya 1
2 imya 3
3 imya2 1
4 imya2 4
5 imya3 1
6 imya3 4

После, как мне выбрать "имена" user_id которые еще не кликал на имя, например

user_id=3

и он мне выдал

imya2
imya3


Или нужно будет выбирать все записи в которых нет user_id=3, а потом уже через PHP удалять?
...
Рейтинг: 0 / 0
23.11.2015, 00:13:03
    #39110507
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL запрос
Наличие поля ID в данном случае совершенно бессмысленно - я даже представить не могу, как и когда оно может использоваться. Я бы сделал первичным кластерный индекс (name, user_id) и плюс неуникальный индекс по user_id, либо наоборот, кластерный (user_id, name) плюс неуникальный по name. Что именно выбрать - зависит от запросов к этой таблице. При таком подходе проверять дублирование не нужно, с этим справится INSERT IGNORE.
...
Рейтинг: 0 / 0
23.11.2015, 00:58:42
    #39110521
Skillsoft
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL запрос
Akina,

Не могли бы привести пример?
...
Рейтинг: 0 / 0
24.11.2015, 17:38:11
    #39112490
Skillsoft
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL запрос
SELECT DISTINCT name FROM table WHERE name NOT IN (SELECT name FROM table WHERE user_id=3)

Такой запрос выдает то, что мне нужно.

Правильно ли использовать такой запрос, или же лучше как-нибудь по другому?
...
Рейтинг: 0 / 0
24.11.2015, 18:16:17
    #39112530
Близнец1980
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL запрос
Skillsoft,

MySQL очень не любит подзапросы вида IN (SELECT ...). Лучше переписать на JOIN и сравнение на NULL - в зависимости от данных разница может быть на порядок.
...
Рейтинг: 0 / 0
24.11.2015, 18:36:42
    #39112551
Skillsoft
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL запрос
Близнец1980,

JOIN вроде для объедения таблиц (у меня одна таблица), или не только?
...
Рейтинг: 0 / 0
24.11.2015, 18:49:41
    #39112563
Alex_Ustinov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL запрос
Skillsoft,

SELECT * FROM table as t1 JOIN table as t2 JOIN table as t3 ...

имеет право на жизнь и более того повсеместно используется
...
Рейтинг: 0 / 0
24.11.2015, 20:44:47
    #39112650
Skillsoft
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL запрос
Сделал вот так

SELECT * FROM table AS t1 RIGHT JOIN table AS t2 ON t2.user_id=3 WHERE t1.name=t2.name

ничего не находит
...
Рейтинг: 0 / 0
24.11.2015, 20:45:20
    #39112651
Skillsoft
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL запрос
SELECT * FROM table AS t1 LEFT JOIN table AS t2 ON t2.user_id=3 WHERE t1.name=t2.name

SELECT * FROM table AS t1 JOIN table AS t2 ON t2.user_id=3 WHERE t1.name=t2.name
...
Рейтинг: 0 / 0
24.11.2015, 20:50:29
    #39112656
Skillsoft
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL запрос
Нашел, у меня user_id 3 небыло
...
Рейтинг: 0 / 0
24.11.2015, 20:56:29
    #39112662
Skillsoft
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL запрос
SELECT DISTINCT t2.name FROM table AS t1 JOIN table AS t2 ON t2.user_id=2 WHERE t1.name=t2.name

Данный запрос работает, только не работает t2.user_id<>2
...
Рейтинг: 0 / 0
24.11.2015, 21:32:42
    #39112678
Selen74
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL запрос
SkillsoftА тогда вот такой вопрос.

Я сделал таблицу

id - уникальные значения
name - не уникальные значения
user_id - не уникальные значения

Далее, по клику пользователя добавляю значение name=user_id (надеюсь правильно понял ваш совет)

получилась таблица
id name user_id
1 imya 1
......
После, как мне выбрать "имена" user_id которые еще не кликал на имя, например

user_id=3

и он мне выдал

imya2
imya3


Или нужно будет выбирать все записи в которых нет user_id=3, а потом уже через PHP удалять?

select * from table where user_id <> 3

Это, как бы, учебник! Но, что-то подсказывает, что это упрощенная задача.

И, если, у Вас куча юзеров будут чего-то делать, то лучше сделать мастер-таблицу наме и подчиненную юзверь.
Типа:
Таблица Наме
Ид, Наме
Таблица Юзверь
Ид, ИдНаме, Юзверь_Ид
И, вот тогда!, соединить их в Inner join где Наме.Ид = Юзверь.ИдНаме

Это называется "реляционная алгебра" - научная дисциплина. Если дальше будете писать - стоит изучить.

Если у Вас небольшие объемы (10-50 записей), можно было бы оставить и первый вариант.

id name user_id
-------------------
1 imya 1 5 3 7 25
2 imya2 5 6 3 4 8 11
3 imya3 2 7 9 4 6 100

select name from table where user_id like '% 3 %'
...
Рейтинг: 0 / 0
25.11.2015, 14:39:57
    #39113169
Skillsoft
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL запрос
В общем, всю ночь смотрел видео про реляционную алгебру, понял разницу между INNER JOIN - OUTER JOIN - LEFT JOIN - RIGHT JOIN. Вот только чего я не понял, так это - для чего в моем случае использовать JOIN?

Сделал по последнему ответу, следующее:


Также, не нашел внятного объяснения, почему не дружат MySQL и IN (SELECT...

Короче, у меня скоро башка взорвется.

Пожалуйста, скажите, как же все таки мне лучше сделать?

SELECT DISTINCT name FROM table WHERE name NOT IN (SELECT name FROM table WHERE user_id=3)
...
Рейтинг: 0 / 0
25.11.2015, 15:20:05
    #39113231
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL запрос
Skillsoftне нашел внятного объяснения, почему не дружат MySQL и IN (SELECT...
Почему? дружат... только эта конструкция требует материализации подзапроса и, как следствие, безбожно тормозит.

Skillsoftкак же все таки мне лучше сделать?
Прежде чем спрашивать "как сделать", сформулируйте внятно, что собсно надо сделать.
Структура понятна: name_id - это кто кликнул, user_id - это кого кликнули.
А что хотим сделать?
...
Рейтинг: 0 / 0
25.11.2015, 15:28:39
    #39113252
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL запрос
Akinaтолько эта конструкция требует материализации подзапроса и, как следствие, безбожно тормозит.Не совсем так. Материализация - это уже исправленный вариант, начиная с версии 5.6. До этой версии все еще хуже.
...
Рейтинг: 0 / 0
25.11.2015, 15:55:32
    #39113296
Skillsoft
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL запрос
Есть таблица NAME, в которой хранятся список имен.

В таблице USER храниться информация о том, какой пользователь уже кликал на имя из таблицы NAME.

Суть в том, что каждый пользователь может кликнут на каждое имя только один раз.

Таблица NAME

id - id имени
name - собственно имя, которое необходимо вывести

Таблица USER

id - id записи (PK)
name_id - id имени из таблицы NAME
user_id - id пользователя который кликнул на имя


Например:
Пользователь ROBOT авторизовался на сайте, его ID=3.
Он посещает некую страницу, на которой случайным образом выводится имя из таблицы NAME, но так как каждый пользователь может кликнуть на имя только один раз, значит имена, которые он уже кликал ему показывать не нужно.

Сначала хотел сделать так:
В таблицу записывается имя и в строку ID пользователей, которые уже кликали по этому имени.

Тут встал вопрос о нормализации данных.

Изменил таблицу:
Каждая запись содержит имя по которому кликнули и ID пользователя, который кликнул.

В последнем варианте, запрос:
SELECT DISTINCT name FROM table WHERE name NOT IN (SELECT name FROM table WHERE user_id=3)
выводит именно то, что мне нужно

Но тут теперь возникает вопрос о скорости обработки.

PS

Надеюсь все правильно изложил.
...
Рейтинг: 0 / 0
25.11.2015, 17:59:25
    #39113457
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL запрос
SkillsoftСуть в том, что каждый пользователь может кликнут на каждое имя только один раз.
Ну это не так - пользователь существо неорганизованное, и может кликать, пока мыша не поломается...

Skillsoftимена, которые он уже кликал ему показывать не нужно.
Если бы это делалось руками, то оно выглядело бы так:
1) выбираем из таблицы user записи, у которых name_id равен этому значению;
2) выбираем из таблицы name записи, для которых id нет в полученном списке, а также отбрасываем самого пользователя.

Первый этап делается запросом query1

Код: sql
1.
2.
3.
SELECT name_id
FROM user
WHERE user_id = :ID



Второй этап делается запросом

Код: sql
1.
2.
3.
4.
5.
6.
SELECT name
FROM name
LEFT JOIN query1 
  ON name.id = query.name_id
WHERE query.name_id IS NULL 
  AND id != :ID



Осталось подставить и получить

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
SELECT name
FROM name
LEFT JOIN 
(
  SELECT name_id
  FROM user
  WHERE user_id = :ID
) query1
  ON name.id = query.name_id
WHERE query.name_id IS NULL 
  AND id != :ID
...
Рейтинг: 0 / 0
25.11.2015, 18:36:39
    #39113489
Skillsoft
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL запрос
Akina,

авторНу это не так - пользователь существо неорганизованное, и может кликать, пока мыша не поломается...

Поэтому и занимаюсь подобным мозг**** )))

автор
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
SELECT name
FROM name
LEFT JOIN 
(
  SELECT name_id
  FROM user
  WHERE user_id = :ID
) query1
  ON name.id = query.name_id
WHERE query.name_id IS NULL 
  AND id != :ID




Немного изменил

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
SELECT name 
FROM name 
LEFT JOIN
(
  SELECT name_id
  FROM users
  WHERE user_id = 5
) query1
  ON name.id = query1.name_id
WHERE query1.name_id IS NULL



Все работает!

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


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