За последние 24 часа нас посетили 16630 программистов и 1643 робота. Сейчас ищут 1203 программиста ...

Подскажите SQL Запрос

Тема в разделе "Сделайте за меня", создана пользователем freelancer.rnd, 24 янв 2015.

  1. freelancer.rnd

    freelancer.rnd Новичок

    С нами с:
    5 май 2014
    Сообщения:
    33
    Симпатии:
    0
    Есть база профилей в которой есть refid оно содержит id партнера.
    id партнеров может повторяться сколько угодно раз у разных профилей
    то есть допустим вот так идет столбик с userid
    1
    1
    1
    2
    2
    3
    5
    7
    8
    5
    5
    5
    6
    4
    4
    4
    4
    4
    Так вот в чем задача
    Нужно выбрать только те профили у которых менее 2х партнеров в системе то есть их id в поле refid повторяется меньше 2 раз.
    Подскажите как сделать это если не достаточно информации спрашуйте.
     
  2. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.115
    Симпатии:
    1.244
    Адрес:
    там-сям
  3. freelancer.rnd

    freelancer.rnd Новичок

    С нами с:
    5 май 2014
    Сообщения:
    33
    Симпатии:
    0
    Так с эти разобрался, и еще один вопросик а как теперь взять те id которых вообще нету в refid?
     
  4. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.115
    Симпатии:
    1.244
    Адрес:
    там-сям
  5. freelancer.rnd

    freelancer.rnd Новичок

    С нами с:
    5 май 2014
    Сообщения:
    33
    Симпатии:
    0
    id|login|regdate|refid
    1|user1|4134966|0
    2|user2|4135100|1
    3|user3|4139000|1
    4|user4|4145686|3
    5|user5|4147806|3
    6|user1|4149800|5

    В Общем вот таблица с этой таблицы мне нужно взять тот ID у которого самая маленькая regdate и его ID либо меньше 2 раз повторяется в refid либо его ID вообще нету в refid

    Так понятней?

    Добавлено спустя 4 минуты 1 секунду:
    Слишком сложно для меня помогите запрос сделать :(
     
  6. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.115
    Симпатии:
    1.244
    Адрес:
    там-сям
    ты думаешь кому-то не пофиг что там для тебя слишком сложно? учись или плати. так понятней?

    форум для тех, кто сам себе помогает. покажи чего ты добился: SQL запрос который ты написал, который почти правильный, но чего-то не хватило… тогда люди к тебе потянутся.
     
  7. freelancer.rnd

    freelancer.rnd Новичок

    С нами с:
    5 май 2014
    Сообщения:
    33
    Симпатии:
    0
    Код (Text):
    1. "SELECT id, COUNT(refid) FROM user_$pre GROUP BY refid HAVING COUNT(refid) <  2 ;"
    Ну вот SQL который вытаскивает те ID которых в refid меньше 2 ,Что сюда нужно дописать что бы он еще вытаскивал те ID которых в refid нету?Извините..
     
  8. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.115
    Симпатии:
    1.244
    Адрес:
    там-сям
    точка с запятой внутри строки запроса не нужна!

    когда делаешь GROUP BY, в строке SELECT нельзя использовать поля, которых нет в строке GROUP BY. но можно использовать функции от других полей.
    например вот так правильно, по чему группируем, то и выводим, плюс функция:
    Код (Text):
    1. SELECT refid, COUNT(*)
    2. FROM user_xxx
    3. GROUP BY refid
    4. HAVING COUNT(*) <  2
    означает "сгруппировать по refid, вывести эти refid и число строк с одинаковым refid. при условии, что это число меньше двух".
    а то, что у тебя написано это галиматья, которая случайно может выдать правдоподобные значения.

    Добавлено спустя 4 минуты 1 секунду:
    поймать случай когда refid вообще не упоминается как-то сложно. потому что таких refid бесконечно много ))) ну почти бесконечно.
    то есть нужен список какие refid вообще возможны, тогда можно будет сочинить запрос про то, какие не встречаются в другом списке. так понятно?

    Добавлено спустя 15 минут 6 секунд:
    только мне кажется, что ты периодически путаешь id и refid? ID вообще не повторяется, он уникален в этой таблице, ёмана!

    попробую исправить:
    подтверди или уточни что имел в виду
     
  9. freelancer.rnd

    freelancer.rnd Новичок

    С нами с:
    5 май 2014
    Сообщения:
    33
    Симпатии:
    0
    ну да у меня перед данным запросам есть функция которая возвращает все возможные ID Вопрос в том как правильно создать запрос.Щас еще раз попробую объяснить.
    Мне нужно из таблицы с профилями взять информацию а точней взять ID профиля который был зарегистрирован раньше всего и он имеет менее 2х партнеров .то есть в поле refid меньше 2х раз указан ID этого профиля или же его вообще нету (в поле refid содержится ID пользователя по чей ссылки зарегистрировался профиль) Теперь на примере напишу таблицу и скажу какой должен выбраться id


    id|login |regdate|refid
    1|Admin|400111 |1 - Профиль Администратора записан сам под себя сам под себя
    2|user1 |400222 |1 - Этот профиль зарегистрирован по ссылки Администратора
    3|user2 |400333 |1 - По ссылки Администратора
    4|user3 |400444| 2 -Зарегистрирован по ссылки user1 и в поле refid содержит ID user1
    5|user4 |400555| 3 -Зарегистрирован по ссылки user2 и в поле refid содержит ID user2
    6|user5 |400666|4 -Зарегистрирован по ссылки user3 и в поле refid содержит ID user3

    В той таблицы должно вернуть ID 2 USER1 . хоть у него и есть одна запись в refid его id но он зарегистрировался раньше остальных и до сих пор не имеет 2 записей ref id.
    ID 1 Admin уже имеет 3 записи refid и он не входит в этот список.
    Я думаю уже более понятно? Давай те продолжим разбираться как создать запрос.Допусти в переменной $ActivID Содержится массив тех ID Которые должны быть в refid. Или можно это тоже узнать из SQL запроса. так же в таблице есть поле tarifs и есть она не пустой то ID Профиля должно проходить проверку в refid
    ..
    Я наверно сильно вас озадачил..(
     
  10. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.115
    Симпатии:
    1.244
    Адрес:
    там-сям
    Вроде складывается картинка. Давай так: ты создашь заготовку с данными на http://sqlfiddle.com/ , а я там добавлю рабочий запрос.
    Будет всё по-взрослому. Ты точно полюбишь sqlfiddle !
     
  11. freelancer.rnd

    freelancer.rnd Новичок

    С нами с:
    5 май 2014
    Сообщения:
    33
    Симпатии:
    0
    а как вам код показать?ссылку выложить?
     
  12. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    Ты его в базу как-то пихал? Вот впихни в сервис sqlfiddle
    Тогда все смогут на него посмотреть и легко подправить и добавить запросы для примера.
     
  13. freelancer.rnd

    freelancer.rnd Новичок

    С нами с:
    5 май 2014
    Сообщения:
    33
    Симпатии:
    0
    Ну это я понял, как его туда впихнуть?код база вставил туда,что дальше ссылку дать ?
     
  14. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.115
    Симпатии:
    1.244
    Адрес:
    там-сям
    да, надо дать ссылку.
     
  15. freelancer.rnd

    freelancer.rnd Новичок

    С нами с:
    5 май 2014
    Сообщения:
    33
    Симпатии:
    0
  16. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.115
    Симпатии:
    1.244
    Адрес:
    там-сям
    прощаю. теперь сделай sqlfiddle со своими данными. и дай ссылку.

    объясняю один раз. там два поля ввода. левое для "схемы" - его заполняшь ты. правое для тестовых запросов - это для того чтобы мы дали тебе ответы.

    слева должны быть запросы вида CREATE TABLE и INSERT . запросы разделяются точкой с запятой. когда вобъешь/скопируешь туда всё, жмешь кнопку Build Schema.
    при успехе у тебя правая половина тоже становится доступна, а адрес странички становится новым и уникальным, чтобы ты на него дал ссылку.
     
  17. freelancer.rnd

    freelancer.rnd Новичок

    С нами с:
    5 май 2014
    Сообщения:
    33
    Симпатии:
    0
  18. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.115
    Симпатии:
    1.244
    Адрес:
    там-сям
    Держи: http://sqlfiddle.com/#!2/87865/4
    Код (Text):
    1. SELECT u.`id`, u.`log`, u.`regdate`, r.`cnt`
    2. FROM
    3.   `user` AS u LEFT JOIN
    4.   (
    5.     SELECT `refid`, COUNT(*) AS `cnt`
    6.     FROM `user`
    7.     GROUP BY `refid`
    8.   ) AS r ON u.`id`=r.`refid`
    9. WHERE
    10.   (r.`cnt` IS NULL) OR
    11.   (r.`cnt` < 2)
    12. ORDER BY u.`regdate` ASC
    Выводит список "слабых партнеров" )))

    Я выше говорил, что для вычисления отсутствующих ID нужен список какие ID вообще есть. Выяснилось, что сама таблица `user`годится для этого. Я соединяю её с подзапросом с ней же самой, но уже сгруппированной по рефералу.

    LEFT JOIN в отличие от INNER JOIN клеит таблицы так, что возможны пустые поля там, где соответствие не найдено. Нам нужны те записи, у которых нет последователей (cnt IS NULL) или число последователей меньше двух. Список отсортирован по возрастанию даты, т.е. сверху самые старые из ленивых.

    Про "мне нужно взять тот ID у которого самая маленькая regdate" я не очень понял смысл. Но если тебе реально нужна только одна запись, то добавим "… LIMIT 1":
    http://sqlfiddle.com/#!2/87865/5
     
  19. freelancer.rnd

    freelancer.rnd Новичок

    С нами с:
    5 май 2014
    Сообщения:
    33
    Симпатии:
    0
    А что в поле 'CNT' Пишется?

    Добавлено спустя 7 минут 48 секунд:
    Вроде запрос работает отлично, Время покажет, честно я восхищен...Я думал для этого потребуется вмешательство PHP и несколько раз запрашивать данные с базы, сейчас я же вижу что все можно решить одним запросом, и честно у меня появился весомый энтузиазм более углубленно выучить SQL !Спасибо Вам за помощь!
     
  20. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.115
    Симпатии:
    1.244
    Адрес:
    там-сям
    Давай, удачи в изучении!

    Добавлено спустя 1 минуту 56 секунд:
    это алиас для количества записей при группировке
     
  21. freelancer.rnd

    freelancer.rnd Новичок

    С нами с:
    5 май 2014
    Сообщения:
    33
    Симпатии:
    0
    Ааа я понял))
     
  22. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    идеальный топик