[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Помогите придумать выборку из бд
jalvar
В таблице много записей (users) есть три нужных нам сейчас поля (id,login,referer)

Мне нужно вывести 100 пользователей у которых больше всего рефереров. Т.е. пользователей с его id в поле referer и так 100 раз ohmy.gif

Всю голову сломал. Помогите.



Спустя 16 минут, 14 секунд (28.04.2012 - 15:00) dadli написал(а):
SELECT * FROM `users` ORDER BY `referer` DESC LIMIT 100


?

Спустя 4 минуты, 32 секунды (28.04.2012 - 15:05) jalvar написал(а):
Нет.
Поле referer содержит id пригласившего его на сайт.
Я должен узнать 100 человек которые больше всего пригласили человек

Спустя 23 минуты, 48 секунд (28.04.2012 - 15:28) dadli написал(а):
но так резултат может бить не точнее, например 120 человек пригласили ровно 500 других человеков, (допустим 500 приглашение самая високая), ви хотите виведит 100 человек, но ето же будит не коректно, так как 20 человек не будит поподатся в резултате.
не так?

Спустя 24 минуты, 55 секунд (28.04.2012 - 15:53) inpost написал(а):
COUNT(*),`id`
GROUP BY `referer`
ORDER BY COUNT(*) DESC
LIMIT 100

Спустя 13 минут, 14 секунд (28.04.2012 - 16:07) jalvar написал(а):
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'COUNT(*),`id` GROUP BY `referer` ORDER BY COUNT(*) DESC LIMIT 100' at line 1

Спустя 9 минут, 5 секунд (28.04.2012 - 16:16) dadli написал(а):
jalvar
ви не отвечали на маём вопросе, ответите и даю вам готови запрос. мне кожется что ето важни момент.

Спустя 50 минут, 6 секунд (28.04.2012 - 17:06) jalvar написал(а):
Цитата (dadli @ 28.04.2012 - 14:16)
jalvar
ви не отвечали на маём вопросе, ответите и даю вам готови запрос. мне кожется что ето важни момент.

Мне нужно только 100 человек. Чтоб список шёл на уменьшение пригласивших. Большую динамику скрипт недолжен выполнять..

Спустя 8 минут, 44 секунды (28.04.2012 - 17:14) inpost написал(а):
jalvar
Ну а ты подставить SELECT, FROM `table` сделал? Или я должен это тоже за тебя писать?

Спустя 11 минут, 2 секунды (28.04.2012 - 17:25) jalvar написал(а):
Цитата (inpost @ 28.04.2012 - 15:14)
jalvar
Ну а ты подставить SELECT, FROM `table` сделал? Или я должен это тоже за тебя писать?

В смысле?

Спустя 38 секунд (28.04.2012 - 17:26) dadli написал(а):
jalvar
хотя я думаю что так не честно, но если так хотите :)
SELECT `referer` FROM (
SELECT `referer`,COUNT(`referer`) AS cnt FROM `users` GROUP BY `referer` ORDER BY cnt DESC LIMIT 100
) AS t

Спустя 17 минут, 4 секунды (28.04.2012 - 17:43) inpost написал(а):
jalvar
То есть в смысле?

Ты вот так просто и скопировал:
COUNT(*),`id`
GROUP BY `referer`
ORDER BY COUNT(*) DESC
LIMIT
100

??? А где указывал FROM, то есть из какой таблицы достаём значения? Я про сообщение о синтаксической ошибке.

Спустя 1 час, 10 минут, 59 секунд (28.04.2012 - 18:54) jalvar написал(а):
SELECT `referer` FROM (
SELECT `referer`,COUNT(`referer`) AS cnt FROM `users` GROUP BY `referer` ORDER BY cnt DESC LIMIT 100
) AS t


А как исключить из результатов там где реферер будет равен нулю? WHERE referer !='' ?
Неправильно работает, выводит рефералов, а рефереров

Спустя 1 час, 30 минут, 42 секунды (28.04.2012 - 20:25) jalvar написал(а):
Помогите с запросом
Этот вобще неработает
COUNT(*),`id`
FROM `users`
GROUP BY `referer`
ORDER BY COUNT(*) DESC
LIMIT
100


А этот запрос работает задам на оборот.. :o
SELECT `referer` FROM (
SELECT `referer`,COUNT(`referer`) AS cnt FROM `users` GROUP BY `referer` ORDER BY cnt DESC LIMIT 100
) AS t

Спустя 6 минут, 30 секунд (28.04.2012 - 20:31) ИНСИ написал(а):
Цитата
Мне нужно вывести 100 пользователей у которых больше всего рефереров

SELECT `u`.`id`, (SELECT COUNT(`id`) FROM `users` WHERE `refer` = `u`.`id` LIMIT 1) AS `size`
FROM `users` AS `u`
WHERE `size` > 100
ORDER BY `size` DESC

Попробуй так

Спустя 4 минуты, 18 секунд (28.04.2012 - 20:36) jalvar написал(а):
#1054 - Unknown column 'refer' in 'where clause'
Я не силен в двойных запросах, но похоже ТЕГ нужно подставить и запросу в скобках..

Спустя 2 минуты, 30 секунд (28.04.2012 - 20:38) ИНСИ написал(а):
jalvar красавчик :) "Теги" верно стоят :) Советую пользоваться переводчиком, чтобы понимать о чем говорит ошибка.

Сейчас ошибка говорит о том, что не может найти поле с названием `refer`

Попробуй так:
SELECT `u`.`id`, (SELECT COUNT(`id`) FROM `users` WHERE `referer` = `u`.`id` LIMIT 1) AS `size`
FROM `users` AS `u`
WHERE `size` > 100
ORDER BY `size` DESC

Спустя 15 минут, 53 секунды (28.04.2012 - 20:54) jalvar написал(а):
Цитата (INSIDIOUS @ 28.04.2012 - 18:38)
jalvar красавчик :) "Теги" верно стоят :) Советую пользоваться переводчиком, чтобы понимать о чем говорит ошибка.

Сейчас ошибка говорит о том, что не может найти поле с названием `refer`

Попробуй так:
SELECT `u`.`id`, (SELECT COUNT(`id`) FROM `users` WHERE `referer` = `u`.`id`) AS `size`
FROM `users` AS `u`
WHERE `size` > 100
ORDER BY `size` DESC

Аа. Спасибо :D
Сейчас жалуется на колонку size. Эм.

Спустя 33 минуты, 13 секунд (28.04.2012 - 21:27) jalvar написал(а):
Пишит что её не существует

Спустя 12 минут, 36 секунд (28.04.2012 - 21:40) jalvar написал(а):
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '.`size` FROM `users` AS `u` WHERE `u`.`size` > 100 ORDER BY `u`.`size` DESC LIM' at line 1

Спустя 3 часа, 13 минут, 23 секунды (29.04.2012 - 00:53) ИНСИ написал(а):
Цитата
Пишит что её не существует

Ну конечно же. Страдаем чепухой. Я тоже ушел в дебри по невнимательности. Попробуй так, должно работать:
SELECT `id`, (SELECT COUNT(`id`) FROM `users` WHERE `referer` = `u`.`id` LIMIT 1) AS `referer`
FROM `users` AS `u`
WHERE `referer` >= 100
ORDER BY `referer` DESC

Спустя 6 часов, 41 минута, 32 секунды (29.04.2012 - 07:35) jalvar написал(а):
Выводит пустой результат
Из-за этого правила (WHERE `referer` >= 100)
Менял на WHERE `referer` !=0
Вышло что-то почти, но не совсем то.
Выводятся в первых записях у кого больше рефералов. А нижу полностью все участники проекта

Спустя 7 минут, 20 секунд (29.04.2012 - 07:42) ИНСИ написал(а):
Скинь дамп таблицы

Спустя 4 минуты, 45 секунд (29.04.2012 - 07:47) jalvar написал(а):
-- phpMyAdmin SQL Dump
-- version 3.4.10.1
-- http://www.phpmyadmin.net
--
-- Хост: localhost
-- Время создания: Апр 29 2012 г., 09:46
-- Версия сервера: 5.1.62
-- Версия PHP: 5.2.17

SET SQL_MODE=
"NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "
+00:00";

--
-- База данных: `jallv122_game`
--

-- --------------------------------------------------------

--
-- Структура таблицы `users`
--

CREATE TABLE IF NOT EXISTS `users` (
`id` int(255) NOT NULL AUTO_INCREMENT,
`login` varchar(255) NOT NULL,
`password` varchar(255) NOT NULL,
`email` varchar(255) NOT NULL,
`wmid` varchar(255) NOT NULL,
`wmr` varchar(255) NOT NULL,
`avatar` varchar(255) NOT NULL DEFAULT '',
`money` varchar(255) NOT NULL DEFAULT '0',
`win` varchar(255) NOT NULL DEFAULT '0',
`defeat` varchar(255) NOT NULL DEFAULT '0',
`last_ip` varchar(255) NOT NULL DEFAULT '0',
`draw` varchar(255) NOT NULL DEFAULT '0',
`rights` varchar(255) NOT NULL DEFAULT '2',
`referer` varchar(255) NOT NULL DEFAULT '',
`income` varchar(255) NOT NULL DEFAULT '0',
`rait` varchar(255) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=96 ;

Спустя 2 минуты, 57 секунд (29.04.2012 - 07:50) ИНСИ написал(а):
Цитата
AUTO_INCREMENT=96

Получается у тебя нет даже 100 записей? Поэтому результат пустой. Ведь условие стоит, чтобы записей о рефере было больше или равно 100. Попробуй опустить это значение до 2.

Если тебе не понятен сам запрос, я могу объяснить

Спустя 2 минуты, 32 секунды (29.04.2012 - 07:52) ИНСИ написал(а):
Цитата
Выводит пустой результат
Из-за этого правила (WHERE `referer` >= 100)
Менял на WHERE `referer` !=0
Вышло что-то почти, но не совсем то.
Выводятся в первых записях у кого больше рефералов. А нижу полностью все участники проекта

Это ты потом добавил? :)

В запросе знак неравенства лучше писать так "<>". Если хочет чтобы вывелись пользователи, у которых рефералов больше нуля, то сделай так:
WHERE `referer` > 0

Спустя 2 минуты, 1 секунда (29.04.2012 - 07:54) jalvar написал(а):
Сам запрос не полностью понятен, в смысле опустить до 2ух. Зачем. Ведь я думаю будут повторные аккаунты с похожими ID

Спустя 6 минут, 1 секунда (29.04.2012 - 08:00) ИНСИ написал(а):
Тебе просто надо сам запрос понять, как работает:

Он выводит всех пользователей (аккаунты) у которых "рефералов" больше 100. В последнем комменте опустили до нуля. Получается выведутся пользователи, у которых "рефералов" больше нуля

Спустя 8 минут, 44 секунды (29.04.2012 - 08:09) jalvar написал(а):
Цитата (INSIDIOUS @ 29.04.2012 - 06:00)
Тебе просто надо сам запрос понять, как работает:

Он выводит всех пользователей (аккаунты) у которых "рефералов" больше 100. В последнем комменте опустили до нуля. Получается выведутся пользователи, у которых "рефералов" больше нуля

Мне нужнов вывести 100 человек, у которых больше всех рефералов.

Спустя 8 минут, 41 секунда (29.04.2012 - 08:18) ИНСИ написал(а):
Цитата
Мне нужнов вывести 100 человек, у которых больше всех рефералов.

SELECT `id`, (SELECT COUNT(`id`) FROM `users` WHERE `referer` = `u`.`id` GROUP BY `referer` LIMIT 1) AS `referer`
FROM `users` AS `u`
WHERE `referer` > 0
ORDER BY `referer` DESC
LIMIT
100

Спустя 11 минут, 20 секунд (29.04.2012 - 08:29) jalvar написал(а):
http://s1.ipicture.ru/uploads/20120429/8xMuVUVw.png

Зеленым верные результаты.
А у аккаунтов (красных) нету рефералов + в поле реферер стоит NULL, на самом деле у них есть реферер

Спустя 29 минут, 35 секунд (29.04.2012 - 08:59) ИНСИ написал(а):
Скинь мне весь дамп таблицы, с записями. Я у себя попробую

Спустя 4 минуты, 38 секунд (29.04.2012 - 09:03) jalvar написал(а):
Скинул в лс

Спустя 8 минут, 5 секунд (29.04.2012 - 09:11) ИНСИ написал(а):
SELECT `id`, (SELECT COUNT(`id`) FROM `users` WHERE `referer` = `u`.`id` LIMIT 1) AS `size`
FROM `users` AS `u`
ORDER BY `size` DESC
LIMIT
100

Спустя 7 минут, 13 секунд (29.04.2012 - 09:19) jalvar написал(а):
Также 3 первые записи нужные. остальные 85 непонятно как влезли. У остальных 85 пользователей. нет реферелов
Я понял. Он выводит 100.. Всё спасибо большое.

Спустя 27 минут, 56 секунд (29.04.2012 - 09:47) inpost написал(а):
COUNT(*),`id`
FROM `users`
GROUP BY `referer`
ORDER BY COUNT(*) DESC
LIMIT
100

Что такое COUNT(*) в начале?

Ты когда запросы пишешь, ты пишешь так:
`id` FROM `table`
или так:
SELECT `id` FROM `table`
???

Спустя 3 минуты, 56 секунд (29.04.2012 - 09:51) ИНСИ написал(а):
В общем, не знаю лучший ли это вариант (может кто-то другой покажет), но можно исключить пользователей, у которых нет рефералов, так:
SELECT `id`, (SELECT COUNT(`id`) FROM `users` WHERE `referer` = `u`.`id` LIMIT 1) AS `size`
FROM `users` AS `u`
WHERE (SELECT COUNT(`id`) FROM `users` WHERE `referer` = `u`.`id` LIMIT 1) > 0
ORDER BY `size` DESC
LIMIT
100

Спустя 6 минут, 44 секунды (29.04.2012 - 09:57) jalvar написал(а):
Спасибо большое!

Спустя 3 минуты, 21 секунда (29.04.2012 - 10:01) ИНСИ написал(а):
Я бы отсеивал уже в цикле, а не в запросе.
SELECT `id`, (SELECT COUNT(`id`) FROM `users` WHERE `referer` = `u`.`id` LIMIT 1) AS `size`
FROM `users` AS `u`
ORDER BY `size` DESC
LIMIT
100

Количество рефералов хранится в 'size'.

Спустя 3 минуты, 33 секунды (29.04.2012 - 10:04) ИНСИ написал(а):
Цитата
`id` int(255)

Кстати, почитай про типы данных. Это точно неправильное значение.

Спустя 27 минут, 16 секунд (29.04.2012 - 10:31) Stasonix написал(а):
Цитата (ИНСИ @ 29.04.2012 - 08:04)
Цитата
`id` int(255)

ничего себе ohmy.gif

для "чайников и кофеварок", число в скобках это не максимальное значение, а кол-во символов, т.е. int(255) - число будет максимально содержать 255 знаков, это нонсенс, ставте int(7) или int(10), хотя вряд ли вам понадобиться миллиард id.

int (7) макс = 9999999

Но это так... Мож кто не понимает еще с чем связывается.


_____________
jallvar.oxnull.net - мой блог.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.