Generowanie daty dla wybranych komentarzy

0

Witam, postaram się krótko opisać problem, a mianowicie: Mam stronę na której jest powiedzmy około 1000 profili. Każdy z profili ma swoje komentarze z różną datą. To co chciałbym zrobił to napisać kod, który pobrałby mi z każdego profilu 3 ostatnie komentarze, ale tylko takie, których ostatni komentarz nie przekracza daty 2016 roku, a te profile, które mają komentarze z powiedzmy 2017 to je omija, a tamtym dodać + 6 miesięcy powiedzmy tym:

UPDATE `sktest`.`wp_comment` SET `time` = DATE_ADD(`time`, INTERVAL 6 MONTH) WHERE date(`wp_comment`.`time`) BETWEEN "2015-05-01" AND "2016-06-01"

Niestety nie mam pojęcia jak się za to zabrać. Jak z każdego profilu pobrać 3 ostanie komentarze? Ma ktoś może jakąś propozycje? Pomysł?
Komentarze trzymam w tabeli wp_comment, która wygląda tak:
title

Kolumna whom to ID profilu użytkownika (w wp_users).

EDIT
Dzięki pomocy @skolukmar udało się wyciągąć 3 ostatnie komentarze ze wszystkich profili.

$wyciagamy_infor=$wpdb->get_results('SELECT a.*, count(*) as row_number FROM wp_comment a JOIN wp_commment b ON a.whom = b.whom AND a.id <= b.id GROUP BY a.whom, a.id ORDER BY a.whom ASC');
	 
	foreach ($wyciagamy_infor as $wyciagamy_info_resr) {		
		$id 			= $wyciagamy_info_resr->id;
		$active 		= $wyciagamy_info_resr->whom;
		$time 		= $wyciagamy_info_resr->time;
		$row_num 		= $wyciagamy_info_resr->row_number;
		
		 
      
	   if ($row_num>3) {
		   continue; 
	   }
	   $sqll2 ='UPDATE `sktest`.`wp_comment` SET `time` = DATE_ADD(`time`, INTERVAL 6 MONTH) WHERE `whom`="'.$active.'" AND `id`="'.$id.'"';
	  $wpdb->query($sqll2);
	 
		
	}
1

Wydaje mi sie, ze najprosciej byloby waciagnac te dane z zapytania SQL, zwracajacym ID uzytkownika i ostatnie trzy komentarze (np. w trzech kolumnach albo wierszach - zalezy jak wygodniej bedzie Ci tego potem uzyc)
W SQL mozesz uzyc funkcji ROW_NUMBER() z PARTITION BY z sortowaniem ORDER BY po dacie wpisu komentarza DESC (malejaco) - jesli korzystasz z MS SQL / ORACLE, to takie zapytanie mozna napisac od 'od reki', w MySQL nie ma tych funkcji, wiec moze Ci sie przydac ten post: https://stackoverflow.com/questions/1895110/row-number-in-mysql

Warunki na uwzglednianie postow z ostatnich X miesiecy sugerowalbym dodac w warunku WHERE w zapytaniu wyciagajacym dane, zamiast robic Update na tabeli.

0

Ok, sprawdziłem twój link i skorzystałem z jednej z odpowiedzi i udało mi się zrobić tak, by wyciągnąć 3 komentarze z każdego profilu, ale nie ostatnie a pierwsze 3.

$wyciagamy_infor=$wpdb->get_results('SELECT a.*, count(*) as row_number FROM wp_cm a JOIN wp_cm b ON a.whom = b.whom AND a.id >= b.id GROUP BY a.whom, a.id ORDER BY a.time DESC');
	 
	foreach ($wyciagamy_infor as $wyciagamy_info_resr) {		
		$id 			= $wyciagamy_info_resr->id;
		$active 		= $wyciagamy_info_resr->whom;
		$time 		= $wyciagamy_info_resr->time;
		$row_num 		= $wyciagamy_info_resr->row_number;
		
	   if ($row_num>3) {
		   continue;
	   }
		echo ''.$active.', '.$time.', '.$row_num.' <br>';	
	}

Jak przypisać row_number tak, by nie zaczynało od pierwszego komentarza w górę tylko od ostatniego w dół?

1

Nie znam MySQL, ale sproboj moze:

$wyciagamy_infor=$wpdb->get_results('SELECT a.*, count(*) as row_number FROM wp_cm a JOIN wp_cm b ON a.whom = b.whom AND a.id >= b.id GROUP BY a.whom, a.id ORDER BY a.time ASC');

albo

$wyciagamy_infor=$wpdb->get_results('SELECT a.*, count(*) as row_number FROM wp_cm a JOIN wp_cm b ON a.whom = b.whom AND a.id <= b.id GROUP BY a.whom, a.id ORDER BY a.time DESC');

Pomoglo ?

0

Tak pomogło, nawet zdążyłem sam do tego dojść. (Czasami aż sam się zadziwiam, że nie sprawdziłem takiej rzeczy). Dziękuję za pomoc.

1 użytkowników online, w tym zalogowanych: 0, gości: 1