powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / SQL запрос
27 сообщений из 27, показаны все 2 страниц
SQL запрос
    #39110132
Skillsoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте. Скажите, пожалуйста, как составить 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
SQL запрос
    #39110170
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
WHERE LOCATE(' 4 ', CONCAT(' ',user_id, ' '))


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

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

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

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

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
SQL запрос
    #39110507
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Наличие поля ID в данном случае совершенно бессмысленно - я даже представить не могу, как и когда оно может использоваться. Я бы сделал первичным кластерный индекс (name, user_id) и плюс неуникальный индекс по user_id, либо наоборот, кластерный (user_id, name) плюс неуникальный по name. Что именно выбрать - зависит от запросов к этой таблице. При таком подходе проверять дублирование не нужно, с этим справится INSERT IGNORE.
...
Рейтинг: 0 / 0
SQL запрос
    #39110521
Skillsoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina,

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

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

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

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

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

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

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

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

ничего не находит
...
Рейтинг: 0 / 0
SQL запрос
    #39112651
Skillsoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
SQL запрос
    #39112656
Skillsoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Нашел, у меня user_id 3 небыло
...
Рейтинг: 0 / 0
SQL запрос
    #39112662
Skillsoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
SQL запрос
    #39112678
Selen74
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
SQL запрос
    #39113169
Skillsoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В общем, всю ночь смотрел видео про реляционную алгебру, понял разницу между 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
SQL запрос
    #39113231
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Skillsoftне нашел внятного объяснения, почему не дружат MySQL и IN (SELECT...
Почему? дружат... только эта конструкция требует материализации подзапроса и, как следствие, безбожно тормозит.

Skillsoftкак же все таки мне лучше сделать?
Прежде чем спрашивать "как сделать", сформулируйте внятно, что собсно надо сделать.
Структура понятна: name_id - это кто кликнул, user_id - это кого кликнули.
А что хотим сделать?
...
Рейтинг: 0 / 0
SQL запрос
    #39113252
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akinaтолько эта конструкция требует материализации подзапроса и, как следствие, безбожно тормозит.Не совсем так. Материализация - это уже исправленный вариант, начиная с версии 5.6. До этой версии все еще хуже.
...
Рейтинг: 0 / 0
SQL запрос
    #39113296
Skillsoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть таблица 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
SQL запрос
    #39113457
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
SQL запрос
    #39113489
Skillsoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
SQL запрос
    #39113491
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SkillsoftВсе работает!
Да, но в твоём запросе юзеру даётся возможность кликнуть себя... это правильно?
...
Рейтинг: 0 / 0
SQL запрос
    #39113501
Skillsoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina,

Себя можно

Кстати, хотел спросить, как тестировать запросы (не знаю как правильно называется). Например время выполнения, и т.д.

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


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