Помогнете с една MySQL завка :)

scoobydoo

Know you can!
Здравейте.

Опитвам се да изтрия всички постове от wordpress блог, които са преди дадена дата и същевременно с това нямат нито един коментар. Написах началото, установих и кои полета ще се ползват, но познанията ми не достигат да я напиша цялата.

DELETE FROM wp_posts WHERE post_date < '2009-01-01' and Съответното ID (това е колона от wp_posts таблицата) го няма нито веднъж в колоната comment_post_ID от таблицата wp_comments

Ще съм много благодарен ако я допише някой. А и ще я разбера и вече ще знам и ще я ползвам като образец за в бъдеще 🙂.

Поздрави.
 
Последно редактирано:
Re: Помогнете с една MySQL завка 🙂

PHP:
DELETE wp_posts FROM wp_posts LEFT JOIN wp_comments ON (wp_comments.comment_post_id = wp_posts.id) WHERE post_date < '2009-01-01' AND wp_comments.id IS NULL

трябва да свърши работа, но не съм сигурен за wp_comments.comment_post_id, wp_posts.id и wp_comments.id колоните дали са така в wp
И винаги по-добре преди да изпълниш това виж все пак дали е както трябва -
PHP:
SELECT wp_posts.* FROM wp_posts LEFT JOIN wp_comments ON (wp_comments.comment_post_id = wp_posts.id) WHERE post_date < '2009-01-01' AND wp_comments.id IS NULL

Пиша на изуст в момента.
 
Re: Помогнете с една MySQL завка 🙂

Значи трябва ти LEFT JOIN или някаква форма на JOIN зависи как ще си подредиш таблиците в последователност за да откриеш всички които нямат коментари. Пиша без да съм го пробвал затова си направи бекъп на базата преди това 😉

Код:
DELETE wp_posts 
FROM wp_post AS p LEFT JOIN "таблицата с коментарите" AS c 
ON p.id = c.comment_post_id
WHERE c.comment_post_id = NULL 
AND p.post_date < '2009-01-01'

ако дава грешки почети малко за LEFT JOIN и за JOIN по принцип и ще разбереш какво става.

На теория JOIN събира две таблици и ги показва заедно по определен критерий. Тук задаваме критерият да е ID-то на поста. Понеже е ляв той ще "покаже" в резултиращата таблица NULL на местата от дясната таблица където не открива мач в таблицата с коментарите за c.ID, а тях
искаш да изтриеш всъщност.

Не знам дали въобще го обясних разбираемо, но поне за насока смятам ще ти свърши работа (ако написаното горе не е съвсем коректно)

едит: изпреварили са ме
 
Последно редактирано:
Re: Помогнете с една MySQL завка 🙂

и от всичко май това излезе:


DELETE wp_posts.* FROM wp_posts LEFT JOIN wp_comments ON (wp_comments.comment_post_id = wp_posts.id) WHERE post_date < '2009-01-01' AND wp_comments.comment_post_id IS NULL


или

SELECT wp_posts.* FROM wp_posts LEFT JOIN wp_comments ON (wp_comments.comment_post_id = wp_posts.id) WHERE post_date < '2009-01-01' AND wp_comments.comment_post_id IS NULL AND post_status = 'publish'
 
Последно редактирано:
Re: Помогнете с една MySQL завка 🙂

А според мен е най-добре да се направи със скрипт използваш функциите на wordpress за триене на постове - иначе остава много мета информация по свързаните таблици. В някакъв момент може да се окаже, че нямаш нито един пост, а мета информацията е на кило. Освен това така не триеш ревизиите на постовете.
 
Re: Помогнете с една MySQL завка 🙂

Разбира се ... то и заявката може да се преправи да изтрие всичко дето е остатъчен боклук ... още някой и джойн и готово 🙂 само трябва да познаваш достатъчно добре wp-а коя таблица за какво е, че аз все още не мога да им разбера цялата логика. Не че съм се занимавал много много
 
Re: Помогнете с една MySQL завка 🙂

Не че нещо ама при мен wp_posts има колона comment_count ... функцията за триене на постове в Wp e http://codex.wordpress.org/Function_Reference/wp_delete_post ...

Най-грубо заявката ти може да изглежда нещо от рода на :
PHP:
$result = mysql_query("SELECT `ID` FROM `wp_posts` WHERE `post_date` < '2009-01-01' and `comment_count` = 0");

while($row = mysql_fetch_array($result))
  {
  wp_delete_post($row[ID]);
  }
 
Re: Помогнете с една MySQL завка 🙂

@cybervn
Да и аз полсе я видях. Въпреки че специално търсих такава преди това. Упс 😱
Все пак разбрах как да правя вече сложни заявки, което ще ползвам от сега нататък.
 
Re: Помогнете с една MySQL завка 🙂

Със sub-query в NOT EXISTS() е най-чисто и разбираемо, според мен.
Разбира се и горните решения са си на 100%.

Код:
DELETE FROM wp_posts 
    WHERE post_date < '2009-01-01' 
        AND NOT EXISTS(SELECT 1 FROM wp_comments 
            WHERE wp_comments.comment_post_id = wp_posts.id LIMIT 1);
 

Back
Горе