|
|
|
SQL запрос
|
|||
|---|---|---|---|
|
#18+
Здравствуйте. Скажите, пожалуйста, как составить 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 этих записей) Заранее спасибо ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.11.2015, 13:49:32 |
|
||
|
SQL запрос
|
|||
|---|---|---|---|
|
#18+
Код: sql 1. Но разумнее нормализовать данные. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.11.2015, 14:28:18 |
|
||
|
SQL запрос
|
|||
|---|---|---|---|
|
#18+
Akina, А как лучше хранить подобные данные? Есть некое имя, по клику на которое записывается ID пользователя который кликнул по этому имени. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.11.2015, 14:35:39 |
|
||
|
SQL запрос
|
|||
|---|---|---|---|
|
#18+
Храни пары (name, user_id). Соответственно каждое отдельное поле дубли разрешает, а насчёт пары - думай сам, можно или нет. Если нет - то уникальный индекс на эту пару. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.11.2015, 15:27:27 |
|
||
|
SQL запрос
|
|||
|---|---|---|---|
|
#18+
Akina, Например, если имен будет 10, а пользователей 100, и каждый пользователь кликнет по каждому имени. В итоге получится 1000 записей. Не много ли? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.11.2015, 15:38:15 |
|
||
|
SQL запрос
|
|||
|---|---|---|---|
|
#18+
Skillsoft1000 записей. Не много ли? Вот когда количество записей превысит десять миллионов, можно будет начинать беспокоиться. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.11.2015, 19:47:04 |
|
||
|
SQL запрос
|
|||
|---|---|---|---|
|
#18+
А тогда вот такой вопрос. Я сделал таблицу 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 удалять? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.11.2015, 20:03:41 |
|
||
|
SQL запрос
|
|||
|---|---|---|---|
|
#18+
Наличие поля ID в данном случае совершенно бессмысленно - я даже представить не могу, как и когда оно может использоваться. Я бы сделал первичным кластерный индекс (name, user_id) и плюс неуникальный индекс по user_id, либо наоборот, кластерный (user_id, name) плюс неуникальный по name. Что именно выбрать - зависит от запросов к этой таблице. При таком подходе проверять дублирование не нужно, с этим справится INSERT IGNORE. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.11.2015, 00:13:03 |
|
||
|
SQL запрос
|
|||
|---|---|---|---|
|
#18+
Akina, Не могли бы привести пример? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.11.2015, 00:58:42 |
|
||
|
SQL запрос
|
|||
|---|---|---|---|
|
#18+
SELECT DISTINCT name FROM table WHERE name NOT IN (SELECT name FROM table WHERE user_id=3) Такой запрос выдает то, что мне нужно. Правильно ли использовать такой запрос, или же лучше как-нибудь по другому? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2015, 17:38:11 |
|
||
|
SQL запрос
|
|||
|---|---|---|---|
|
#18+
Skillsoft, MySQL очень не любит подзапросы вида IN (SELECT ...). Лучше переписать на JOIN и сравнение на NULL - в зависимости от данных разница может быть на порядок. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2015, 18:16:17 |
|
||
|
SQL запрос
|
|||
|---|---|---|---|
|
#18+
Близнец1980, JOIN вроде для объедения таблиц (у меня одна таблица), или не только? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2015, 18:36:42 |
|
||
|
SQL запрос
|
|||
|---|---|---|---|
|
#18+
Skillsoft, SELECT * FROM table as t1 JOIN table as t2 JOIN table as t3 ... имеет право на жизнь и более того повсеместно используется ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2015, 18:49:41 |
|
||
|
SQL запрос
|
|||
|---|---|---|---|
|
#18+
Сделал вот так SELECT * FROM table AS t1 RIGHT JOIN table AS t2 ON t2.user_id=3 WHERE t1.name=t2.name ничего не находит ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2015, 20:44:47 |
|
||
|
SQL запрос
|
|||
|---|---|---|---|
|
#18+
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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2015, 20:45:20 |
|
||
|
SQL запрос
|
|||
|---|---|---|---|
|
#18+
Нашел, у меня user_id 3 небыло ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2015, 20:50:29 |
|
||
|
SQL запрос
|
|||
|---|---|---|---|
|
#18+
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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2015, 20:56:29 |
|
||
|
SQL запрос
|
|||
|---|---|---|---|
|
#18+
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 %' ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2015, 21:32:42 |
|
||
|
SQL запрос
|
|||
|---|---|---|---|
|
#18+
В общем, всю ночь смотрел видео про реляционную алгебру, понял разницу между 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) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2015, 14:39:57 |
|
||
|
SQL запрос
|
|||
|---|---|---|---|
|
#18+
Skillsoftне нашел внятного объяснения, почему не дружат MySQL и IN (SELECT... Почему? дружат... только эта конструкция требует материализации подзапроса и, как следствие, безбожно тормозит. Skillsoftкак же все таки мне лучше сделать? Прежде чем спрашивать "как сделать", сформулируйте внятно, что собсно надо сделать. Структура понятна: name_id - это кто кликнул, user_id - это кого кликнули. А что хотим сделать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2015, 15:20:05 |
|
||
|
SQL запрос
|
|||
|---|---|---|---|
|
#18+
Akinaтолько эта конструкция требует материализации подзапроса и, как следствие, безбожно тормозит.Не совсем так. Материализация - это уже исправленный вариант, начиная с версии 5.6. До этой версии все еще хуже. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2015, 15:28:39 |
|
||
|
SQL запрос
|
|||
|---|---|---|---|
|
#18+
Есть таблица 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 Надеюсь все правильно изложил. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2015, 15:55:32 |
|
||
|
SQL запрос
|
|||
|---|---|---|---|
|
#18+
SkillsoftСуть в том, что каждый пользователь может кликнут на каждое имя только один раз. Ну это не так - пользователь существо неорганизованное, и может кликать, пока мыша не поломается... Skillsoftимена, которые он уже кликал ему показывать не нужно. Если бы это делалось руками, то оно выглядело бы так: 1) выбираем из таблицы user записи, у которых name_id равен этому значению; 2) выбираем из таблицы name записи, для которых id нет в полученном списке, а также отбрасываем самого пользователя. Первый этап делается запросом query1 Код: sql 1. 2. 3. Второй этап делается запросом Код: sql 1. 2. 3. 4. 5. 6. Осталось подставить и получить Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2015, 17:59:25 |
|
||
|
SQL запрос
|
|||
|---|---|---|---|
|
#18+
Akina, авторНу это не так - пользователь существо неорганизованное, и может кликать, пока мыша не поломается... Поэтому и занимаюсь подобным мозг**** ))) автор Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. Немного изменил Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Все работает! Спасибо огромное!!! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2015, 18:36:39 |
|
||
|
|

start [/forum/topic.php?fid=47&msg=39113169&tid=1832451]: |
0ms |
get settings: |
6ms |
get forum list: |
13ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
31ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
74ms |
get tp. blocked users: |
1ms |
| others: | 191ms |
| total: | 330ms |

| 0 / 0 |
