Правила     Закладки     Карма    Календарь    Журналы    Помощь    Поиск    PDA    Чат   
        СМС-ки
   
Пейджер выключен!
 
Фильтр авторов:    показать 
  скрыть
  Ответ в темуСоздание новой темыСоздание опроса

> По 3 строки к каждой строке другой таблицы, Как-то так
savelikan  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 370
Пользователь №: 18633
На форуме: 7 лет, 3 месяца, 28 дней
Карма:




Привет всем! опять обращаюсь к Вам за помощью)
Есть две таблицы, простой пример
Таблица 1 "список вопросов":
kq_id | kq_text | kq_subject

таблица 2 "коментарии":
kd_id | kd_base | kd_text

Есть задача. Выбрать все записи из таблицы 1, и максимум по три комментария из таблицы 2 к каждой записи в таблице 1.

Подскажите, пожалуйста, как можно реализовать.

Я вот пробовал вот так:
SELECT *
FROM `krok_questions`
RIGHT JOIN `krok_discuss` ON (`krok_discuss`.`kd_base` = `krok_questions`.`kq_id`)
WHERE `kq_subject` = ".$ks_id."
ORDER BY `kq_id`

но вот как то нужно добавить лимит, чтоб RIGHT JOIN Не присоеденял больше 3х записей к одной из первой таблицы


--------------------
Одесса - мой город!)))
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
depp  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 297
Пользователь №: 40589
На форуме: 2 года, 3 дня
Карма: 19




тут надо вложенный запрос делать с лимтом.
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
kaww  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 1755
Пользователь №: 20757
На форуме: 6 лет, 10 месяцев, 5 дней
Карма: 184




Если не накосяил нигде в запросе, то как-то так:
set @dcount := 0, @qid := 0;
select
q.*, d.*,
@dcount := if(@qid = id, @dcount + 1, 1) as rank,
@qid := q.kq_id as qid
from krok_questions as q
left join krok_discuss as d on d.kd_base=q.kq_id
order by q.kq_id, rate desc
having
rank <= 3
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Undertaker  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 312
Пользователь №: 31230
На форуме: 4 года, 10 месяцев, 13 дней
Карма:




Совсем ничего не понял из структуры таблиц, просто оставлю здесь такой запрос
SELECT * FROM `krok_discuss` WHERE (`id`) IN (SELECT `id` FROM `krok_questions`) limit 3


--------------------
Из отчета службы безопасности:
... по поводу взлома китайцами сервера Пентагона:
1) Каждый китаец попробовал один пароль.
2) Каждый второй пароль был - maodzedun.
3) На 657983241-й попытке сервер согласился что у него пароль - maodzedun
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
savelikan  
 ۩  [x] Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 370
Пользователь №: 18633
На форуме: 7 лет, 3 месяца, 28 дней
Карма:




Цитата (kaww @ 7.07.2016 - 02:02)
Если не накосяил нигде в запросе, то как-то так:
set @dcount := 0, @qid := 0;
select
q.*, d.*,
@dcount := if(@qid = id, @dcount + 1, 1) as rank,
@qid := q.kq_id as qid
from krok_questions as q
left join krok_discuss as d on d.kd_base=q.kq_id
order by q.kq_id, rate desc
having
rank <= 3

Спасибо! Понял в каком направлении работать.
В Вашем запросе поле id не найдено.
Я сделал вот такой запрос:
set @dcount := 0, @qid := 0;
select
q.kq_id, d.kd_id,d.kd_base,d.kd_msg,
@dcount := if(@qid = kq_id, @dcount + 1, 1) as rank,
@qid := q.kq_id as qid
from krok_questions as q
left join krok_discuss as d on d.kd_base=q.kq_id
WHERE `kq_subject` = 441
having rank <= 3
order by q.kq_id

И получил вот такой результат, как на картинке.
rank не увиличивается

Undertaker, в таком запросе только 3 результата, а мне нужно как вконтакте: запись из krok_questions и к ней три комментарии из krok_discuss

Присоединённое изображение
Присоединённое изображение


--------------------
Одесса - мой город!)))
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
savelikan  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 370
Пользователь №: 18633
На форуме: 7 лет, 3 месяца, 28 дней
Карма:




Вот, что я понял: Если в таблице krok_discuss записи идут по порядку, например:
1| 122163 | сообщение 1
2| 122163 | сообщение 2
3| 122163 | сообщение 3
4| 122163 | сообщение 4
5| 122164 | сообщение 1
6| 122164 | сообщение 2
7| 122164 | сообщение 3

то всё работает. Но ести вот так:
1| 122163 | сообщение 1
2| 122163 | сообщение 2
3| 122164 | сообщение 1
4| 122163 | сообщение 3
5| 122163 | сообщение 4
6| 122164 | сообщение 2
7| 122164 | сообщение 3

тогда rank сбивается на 1
if(@qid = q.kq_id, @dcount+1, 1)


--------------------
Одесса - мой город!)))
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
kaww  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 1755
Пользователь №: 20757
На форуме: 6 лет, 10 месяцев, 5 дней
Карма: 184




savelikan, совсем какой-то нерабочий запрос оказался. ;) Во так должно быть норм
set @dcount := 0, @qid := 0;
select * from (
select
q.*, d.*,
@dcount := if(@qid = q.kq_id, @dcount + 1, 1) as rank,
@qid := q.kq_id as qid
from krok_questions as q
left join krok_discuss as d on d.kd_base=q.kq_id
order by q.kq_id, rank) as _t0
where rank <= 3;;
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
savelikan  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 370
Пользователь №: 18633
На форуме: 7 лет, 3 месяца, 28 дней
Карма:




Цитата (kaww @ 7.07.2016 - 08:29)
savelikan, совсем какой-то нерабочий запрос оказался. ;) Во так должно быть норм

Большое спасибо)))
Но этот тоже не считал rank)))
Вот, как я сделал:

select
q.*, d.*, `krok_base`.*,
@dcount := if(@qid = kq_id, @dcount + 1, 1) as rank,
@qid := q.kq_id as qid
from krok_questions as q
left join (SELECT * FROM `krok_discuss` ORDER BY `kd_base`, `kd_date` DESC) as d on d.kd_base=q.kq_id
WHERE `kq_subject` = ".$ks_id." AND `kd_id` IS NOT NULL
having
rank <= 3
order by q.kq_id

Очень хорошо работает)
Вот только сейчас пытаюсь сделать COUNT(`d`.`kd_id`) до выполнения having rank <= 3, чтобы знать, сколько ввообще есть комментариев к каждой записи


--------------------
Одесса - мой город!)))
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
kaww  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 1755
Пользователь №: 20757
На форуме: 6 лет, 10 месяцев, 5 дней
Карма: 184




savelikan, оказалось, что мой предыдущий запрос отлично работает на mysql5.5, но на 5.6 дает неверный результат. У тебя, вероятно, 5,6.
PMПисьмо на e-mail пользователю
    1   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
savelikan  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 370
Пользователь №: 18633
На форуме: 7 лет, 3 месяца, 28 дней
Карма:




Цитата (kaww @ 7.07.2016 - 11:23)
savelikan, оказалось, что мой предыдущий запрос отлично работает на mysql5.5, но на 5.6 дает неверный результат. У тебя, вероятно, 5,6.

А подскажите, куда здесь можно COUNT(`d`.`kd_id`) прикрутить?


--------------------
Одесса - мой город!)))
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
  Быстрый ответ
Информация о Госте
Введите Ваше имя
Кнопки кодов
Для вставки цитаты, выделите нужный текст и
НАЖМИТЕ СЮДА
Введите сообщение
Смайлики
:huh:  :o  ;) 
:P  :D  :lol: 
B)  :rolleyes:  <_< 
:)  :angry:  :( 
:unsure:  :blink:  :ph34r: 
     
Показать всё

Опции сообщения  Включить смайлики?
 Включить подпись?
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:

Опции темы Ответ в темуСоздание новой темыСоздание опроса