Я застряг на одному запиті в mysql

Я застряг на одному запиті в mysql.

Я хочу отримати останній коментар зі столу

  • the comment should be most recent comment on the blog
  • the blogs should be latest 3 blogs.
  • display comment & blog only if their status is Enabled

записи повинні бути подібними до цього
Введіть опис зображення тут Введіть опис зображення тут Введіть опис зображення тут Структура таблиці для таблиці таблиця


  
blog_id int - primary (auto increment)
blog_title       -varchar
blog_desc        -varchar
blog_image       -varchar
blog_tags        -varchar
tot_comments     -int
blog_creater     -varchar
blog_create_date -datetime
blog_status      -enum ('Enable','Disable')

table structure for the table blog_comment


comment_id       -int (auto increment)  
fk_blog_id       -int  
comment          -varchar  
comment_by       -varchar  
email            -varchar  
comment_date     -datetime  
comment_status   -enum ('Enable','Disable')

А нижче - запит, написаний мною, але результат, який я отримую, неправильний.

SELECT b.blog_title,b.blog_image, bc.*
FROM blog_comments  bc, blog b
WHERE bc.comment_status='Enable'
AND b.blog_status='Enable'
AND b.blog_id=bc.fk_blog_id
GROUP BY bc.fk_blog_id    
ORDER BY bc.comment_date DESC 
LIMIT 0,3

Вихід


enter image description here

8
додано Автор Barmar, джерело
+1 за те, як ви представили проблему; дуже чисте опис
додано Автор Ionut Flavius Pogacian, джерело
Ви хочете створити результат для публікації в блозі, і це відповідні коментарі в одному запиті? якщо так, то, будь ласка, надайте твердження "створити" для цієї два таблиці. Я хочу створити таблиці.
додано Автор ripa, джерело
Ви хочете створити результат для публікації в блозі, і це відповідні коментарі в одному запиті? якщо так, то, будь ласка, надайте твердження "створити" для цієї два таблиці. Я хочу створити таблиці.
додано Автор ripa, джерело
+7 За що в основному є FAQ? Я тут щось відсутній?
додано Автор Strawberry, джерело
+7 За що в основному є FAQ? Я тут щось відсутній?
додано Автор Strawberry, джерело
група за групами всі результати від цього певного блогу в один рядок; тому ви не отримуєте список усіх коментарів ..
додано Автор Luceos, джерело
група за групами всі результати від цього певного блогу в один рядок; тому ви не отримуєте список усіх коментарів ..
додано Автор Luceos, джерело
@IonutFlaviusPogacian: Дійсно, крім заголовку, який ...
додано Автор Mr47, джерело
@IonutFlaviusPogacian: Дійсно, крім заголовку, який ...
додано Автор Mr47, джерело

12 Відповіді

для цього простого рішення буде виконуватися 2 запити для результату. Перший запит отримує результат блогу

$db_blog="select blog_id,blog_title from blog where blog_ststus='Enable'";
$que=mysql_query($db_blog); 
while($row=mysql_fetch_object($que))
{
    echo $row->blog_title;
    $db_comment="select comment from blog_comments where fk_blog_id=".$row->blog_id." and comment_status='Enable' order by comment_date desc";
    $quec=mysql_query($db_comment);
    while($comment=mysql_fetch_object($quec))
    {
         echo $comment->comment;
    }
}
1
додано
@AlpeshTrivedi дуже дякую
додано Автор ripa, джерело
@AlpeshTrivedi Я спробую зробити це в одному запиті. Якщо я досяг успіху, то я розміщую його тут.
додано Автор ripa, джерело
Ви не повинні розміщувати запит у циклі while. Це може бути дуже небезпечним і вбивати продуктивність. Для кожного результату з першого запиту ви будете запускати новий запит. Якщо перший запит поверне 9 результатів, ви будете виконувати 9 додаткових запитів. Використання 2 запитів не є лише опцією, але видаляє другий запит поза циклом while і використовує результати з першого запиту!
додано Автор Cecil Zorg, джерело
спасибі, це працювало !! дуже тобі дякую. але чи знаєте ви, як отримати результат від одного запиту
додано Автор Alpesh Trivedi, джерело
SELECT b.blog_title,b.blog_image, bc.*
FROM blog b
left join (
Select * from 
blog_comments bc
WHERE bc.comment_status='Enable'
GROUP BY bc.fk_blog_id    
having max(bc.comment_date) =  bc.comment_date
) bcc on b.blog_id=bcc.fk_blog_id
where
b.blog_status='Enable'
ORDER BY b.blog_create_date desc
LIMIT 0,3

Спробуй це

1
додано
там ти йдеш зафіксовано
додано Автор Techmonk, джерело
Ви можете створити SQLFIDDLE? sqlfiddle.com
додано Автор Techmonk, джерело
спасибі, але цей запит повертає мені лише один рядок з бази даних .....
додано Автор Alpesh Trivedi, джерело
Я хочу топ 3 блоги та 1 останній коментар до блогу
додано Автор Alpesh Trivedi, джерело
@ Techmonk дякую, але це також забезпечує неправильний вихід.
додано Автор Alpesh Trivedi, джерело
SELECT b.blog_title,b.blog_image, bc.*
FROM blog b
left join (
Select * from 
blog_comments bc
WHERE bc.comment_status='Enable'
GROUP BY bc.fk_blog_id    
having max(bc.comment_date) =  bc.comment_date
) bcc on b.blog_id=bcc.fk_blog_id
where
b.blog_status='Enable'
ORDER BY b.blog_create_date desc
LIMIT 0,3

Спробуй це

1
додано
там ти йдеш зафіксовано
додано Автор Techmonk, джерело
Ви можете створити SQLFIDDLE? sqlfiddle.com
додано Автор Techmonk, джерело
@ Techmonk дякую, але це також забезпечує неправильний вихід.
додано Автор Alpesh Trivedi, джерело
спасибі, але цей запит повертає мені лише один рядок з бази даних .....
додано Автор Alpesh Trivedi, джерело
Я хочу топ 3 блоги та 1 останній коментар до блогу
додано Автор Alpesh Trivedi, джерело

Спробуйте це:

SELECT * FROM blog_comments  bc, blog b
WHERE `bc.comment_status`='Enable'
AND `b.blog_status`='Enable'
AND `b.blog_id`=bc.fk_blog_id
ORDER BY `bc.comment_date` DESC LIMIT 1;

Спробуйте простіше:

SELECT * FROM `blog_comment` WHERE 'blog_status'='Enable' AND 'blog_id'='$blogidherefromtitle' ORDER BY 'comment_date' DESC LIMIT1
1
додано
Блог-таблиця відсутній у цьому запиті ... :)
додано Автор Alpesh Trivedi, джерело

Спробуйте це:

SELECT * FROM blog_comments  bc, blog b
WHERE `bc.comment_status`='Enable'
AND `b.blog_status`='Enable'
AND `b.blog_id`=bc.fk_blog_id
ORDER BY `bc.comment_date` DESC LIMIT 1;

Спробуйте простіше:

SELECT * FROM `blog_comment` WHERE 'blog_status'='Enable' AND 'blog_id'='$blogidherefromtitle' ORDER BY 'comment_date' DESC LIMIT1
1
додано
Блог-таблиця відсутній у цьому запиті ... :)
додано Автор Alpesh Trivedi, джерело
select b.blog_title, b.blog_image, bc.*
from blog b join
(select bc.*
 from bc join (select fk_blog_id, max(comment_date) latest_date
               from blog_comment
               where comment_status = 'Enable'
               group by fk_blog_id) latest
 on bc.fk_blog_id = latest.fk_blog_id and bc.comment_date = latest_date) c
on b.blog_id = c.fk_blog_id
where b.blog_status = 'Enable'
order by c.comment_date desc
limit 0, 3

Підзапит c знаходить рядок з останнім коментарем для кожного блогу, використовуючи техніку в пов'язаному записі. Потім додається таблиця blog , щоб отримати відповідні дані блогу.

0
додано
Виправлено це. Він називається c у цій частині запиту.
додано Автор Barmar, джерело
Отримання помилки: - # 1051 - Невідома таблиця 'bc'
додано Автор Alpesh Trivedi, джерело
SELECT b.blog_title,b.blog_image, bc.*
FROM blog_comments  bc JOIN blog b ON bc.fk_blog_id = b.blog_id
WHERE bc.comment_status='Enable'
AND b.blog_status='Enable'
GROUP BY bc.fk_blog_id    
ORDER BY bc.comment_date DESC 
LIMIT 0,3
0
додано
SELECT b.blog_title,b.blog_image, bc.*
FROM blog_comments  bc JOIN blog b ON bc.fk_blog_id = b.blog_id
WHERE bc.comment_status='Enable'
AND b.blog_status='Enable'
GROUP BY bc.fk_blog_id    
ORDER BY bc.comment_date DESC 
LIMIT 0,3
0
додано

Спробуйте цей запит

SELECT 
  bc.* 
FROM
  blog AS b 
  INNER JOIN (SELECT id , MAX(id) AS MaxID FROM blog) AS bl ON bl.id = b.id 
  LEFT JOIN blog_comment AS bc ON bc.fk_blog_id = b.id 
ORDER BY bc.comment_id DESC 
LIMIT 3     

EDITS:

SELECT 
  bc.* 
FROM
  blog AS b 
  INNER JOIN (SELECT id , MAX(id) AS MaxID FROM blog GROUP BY id) AS bl ON bl.id = b.id 
  INNER JOIN (SELECT MAX(id) , fk_blog_id FROM blog_comment  GROUP BY id) AS bc ON bc.fk_blog_id = b.id 
ORDER BY bc.comment_id DESC 
LIMIT 3

Це для 3 останніх блогів та найновіших єдиних коментарів для кожного блогу

Тут, використовуючи внутрішню приєднання, отримаєте останній блог. ніж приєднатися до коментарів і замовити їх з датою або ідентифікатором і обмежити їх відповідно до ваших вимог.

0
додано
@AlpeshTrivedi ніж те, що ви хочете? саме те, що мій запит призначений.
додано Автор Muhammad Raheel, джерело
@AlpeshTrivedi ви пробували знову я редагував?
додано Автор Muhammad Raheel, джерело
Гаразд, дозвольте мені редагувати його
додано Автор Muhammad Raheel, джерело
дякую, і я намагався отримати неправильний вихід. Він витягує лише коментарі fk_blog_id = 3
додано Автор Alpesh Trivedi, джерело
спасибі, але це помилка: # 1054 - Невідомий стовпчик "bl.MAX" в "on clause" # 1054 - Невідомий стовпець "bl.MAX" в "on clause"
додано Автор Alpesh Trivedi, джерело

Спробуйте цей запит

SELECT 
  bc.* 
FROM
  blog AS b 
  INNER JOIN (SELECT id , MAX(id) AS MaxID FROM blog) AS bl ON bl.id = b.id 
  LEFT JOIN blog_comment AS bc ON bc.fk_blog_id = b.id 
ORDER BY bc.comment_id DESC 
LIMIT 3     

EDITS:

SELECT 
  bc.* 
FROM
  blog AS b 
  INNER JOIN (SELECT id , MAX(id) AS MaxID FROM blog GROUP BY id) AS bl ON bl.id = b.id 
  INNER JOIN (SELECT MAX(id) , fk_blog_id FROM blog_comment  GROUP BY id) AS bc ON bc.fk_blog_id = b.id 
ORDER BY bc.comment_id DESC 
LIMIT 3

Це для 3 останніх блогів та найновіших єдиних коментарів для кожного блогу

Тут, використовуючи внутрішню приєднання, отримаєте останній блог. ніж приєднатися до коментарів і замовити їх з датою або ідентифікатором і обмежити їх відповідно до ваших вимог.

0
додано
@AlpeshTrivedi ніж те, що ви хочете? саме те, що мій запит призначений.
додано Автор Muhammad Raheel, джерело
@AlpeshTrivedi ви пробували знову я редагував?
додано Автор Muhammad Raheel, джерело
Гаразд, дозвольте мені редагувати його
додано Автор Muhammad Raheel, джерело
дякую, і я намагався отримати неправильний вихід. Він витягує лише коментарі fk_blog_id = 3
додано Автор Alpesh Trivedi, джерело
спасибі, але це помилка: # 1054 - Невідомий стовпчик "bl.MAX" в "on clause" # 1054 - Невідомий стовпець "bl.MAX" в "on clause"
додано Автор Alpesh Trivedi, джерело

спробуй

SELECT b.blog_title,b.blog_image, bc.*
FROM blog_comments AS bc, blog AS b
WHERE bc.comment_status='Enable'
AND b.blog_status='Enable'
AND b.blog_id=bc.fk_blog_id
GROUP BY bc.fk_blog_id    
ORDER BY bc.comment_date DESC 
LIMIT 0,3;

(Я не впевнений 100%)

0
додано
дякую за вашу відповідь ... але це той самий запит, який я спробував !!!
додано Автор Alpesh Trivedi, джерело
Я отримую неправильний результат цього запиту ... :(
додано Автор Alpesh Trivedi, джерело
Я вирішив, що "AS" це проблема. вибачте
додано Автор keks, джерело

спробуй

SELECT b.blog_title,b.blog_image, bc.*
FROM blog_comments AS bc, blog AS b
WHERE bc.comment_status='Enable'
AND b.blog_status='Enable'
AND b.blog_id=bc.fk_blog_id
GROUP BY bc.fk_blog_id    
ORDER BY bc.comment_date DESC 
LIMIT 0,3;

(Я не впевнений 100%)

0
додано
дякую за вашу відповідь ... але це той самий запит, який я спробував !!!
додано Автор Alpesh Trivedi, джерело
Я отримую неправильний результат цього запиту ... :(
додано Автор Alpesh Trivedi, джерело
Я вирішив, що "AS" це проблема. вибачте
додано Автор keks, джерело
Ukrainian PHP comunity
Ukrainian PHP comunity
885 учасників

dev-ua/php