Помогите с запросом mysql

12
дани мапов
На сайте с 06.09.2012
Offline
204
#11

kondratt вы мой запрос пробовали? Он рабочий, только в таблице star_option поле - id_post, а вы в первом посте указали id. Исправьте это в запросе.

Написание и доработка скриптов (PHP, MySQL, JavaScript, jQuery) (/ru/forum/811046)
KS
На сайте с 11.06.2012
Offline
17
#12

Я бы сделал иначе. Тут нет необходимости в подзапросах, и таблицу post можно вообще не трогать, так как о наличии поста для каждой звезды свидетельствует соответствующая запись в star_option:

SELECT s.*, COUNT(so.id_post) AS cnt

FROM star s
LEFT JOIN star_option so ON s.id=so.star_id
GROUP BY s.id
FileSafe (http://filesafe.anek.ws/) - мониторинг неизменности файлов сайта для защиты от взлома. Для форумчан - первый год бесплатно.
K
На сайте с 04.12.2012
Offline
2
#13
дани мапов:
kondratt вы мой запрос пробовали? Он рабочий, только в таблице star_option поле - id_post, а вы в первом посте указали id. Исправьте это в запросе.

Извини не не проверял щас все варианты проверю

Я бы сделал иначе. Тут нет необходимости в подзапросах, и таблицу post можно вообще не трогать, так как о наличии поста для каждой звезды свидетельствует соответствующая запись в star_option:

Код:
SELECT s.*, COUNT(so.id_post) AS cnt

FROM star s
LEFT JOIN star_option so ON s.id=so.star_id
GROUP BY s.id

Точно точно туплю чет ппц:(:(:(

---------- Добавлено 31.12.2012 в 06:34 ----------

Всем огромное спасибо взял последний вариант

---------- Добавлено 31.12.2012 в 06:49 ----------

$offset_result = mysql_query( " SELECT FLOOR(RAND() * COUNT(*)) AS `offset` FROM `table` ");

$offset_row = mysql_fetch_object( $offset_result );
$offset = $offset_row->offset;
$result = mysql_query( " SELECT * FROM `table` LIMIT $offset, 14 " );

а можно ли вот с этим запросом что нибудь сделать он работает прекрасно только иногда бывает что что выводиться меньше записей чем надо. Ну или как лучше сделать случайный вывод ?

KS
На сайте с 11.06.2012
Offline
17
#14

FLOOR(RAND() * COUNT(*) ) - возвращает случайное число, от нуля, до количества записей минус 1. То есть, к примеру, если в таблице ровно 100 записей, то эта конструкция сгенерирует случайное число от нуля до 99. Далее это число используется в качестве офсета - сдвига от начала списка записей, в запросе, который должен выдать 14 записей. Всё будет работать хорошо для тех случаев, когда случайное число попало в диапазон от 0 до 86. То есть, когда после сдвига на это число, остаётся ещё хотя бы 14 записей для показа. Если же оно превысило 86, то выдано будет меньше 14 записей. Решается эта проблема просто: нужно изначально уменьшить диапазон генерации случайного числа на 13: FLOOR(RAND() * (COUNT(*)-13))

K
На сайте с 04.12.2012
Offline
2
#15
KostaShah:
FLOOR(RAND() * COUNT(*) ) - возвращает случайное число, от нуля, до количества записей минус 1. То есть, к примеру, если в таблице ровно 100 записей, то эта конструкция сгенерирует случайное число от нуля до 99. Далее это число используется в качестве офсета - сдвига от начала списка записей, в запросе, который должен выдать 14 записей. Всё будет работать хорошо для тех случаев, когда случайное число попало в диапазон от 0 до 86. То есть, когда после сдвига на это число, остаётся ещё хотя бы 14 записей для показа. Если же оно превысило 86, то выдано будет меньше 14 записей. Решается эта проблема просто: нужно изначально уменьшить диапазон генерации случайного числа на 13: FLOOR(RAND() * (COUNT(*)-13))

Спасибо. я знал как эта конструкция работает просто не знал как задать рандомное число промежуток 😂

KS
На сайте с 11.06.2012
Offline
17
#16

А ещё, если важно чтобы записи были реально в разброс, то можно сделать так:

SELECT * FROM `table` ORDER BY RAND() LIMIT 14

Правда, с большими таблицами этот способ будет значительно более ресурсоёмким.

12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий