noys
@noys
красноглазик

Как объединить результаты запроса с одинаковыми ячейками в переменную?

Есть запрос к базе, выдергивает из таблицы ряды, соответствующие условию.
Необходимо в переменной внутри цикла объединить несколько рядов в которых email одинаковы, чтобы записи с одинаковыми email отправить по этому email при условии что адреса заранее неизвестны. То есть в итоге надо на каждый из адресов отправить по одному письму, в письме конкретному получателю чтобы находились все его записи.

Как модифицировать этот кусок кода?

$day1 = mktime(0, 0, 0, date("m"), date("d")-7, date("Y"));
$day2 = mktime(0, 0, 0, date("m"), date("d")-6, date("Y"));

$sql = "SELECT *
	FROM table
	WHERE UNIX_TIMESTAMP(created) > $day1 AND UNIX_TIMESTAMP(created) < $day2
	ORDER BY email DESC";

$result = mysql_query($sql) or die(mysql_error());

while($row = mysql_fetch_assoc($result))
{

	if($row['email'] == $lastemail)
		$message = "<br />$row[id]<br />$row[email]<br />$row[created]<br />";
	else
		$message = "<br />-----------<br /><br />$row[id]<br />$row[email]<br />$row[created]<br />";

	echo $message;

	$lastemail = $row['email'];
}


Результат выполнения кода в нынешнем виде:
-----------

293
1@site.com
2014-12-16 22:42:04

-----------

283
2@site.com
2014-12-16 14:05:08

282
2@site.com
2014-12-16 13:55:47

-----------

288
3@site.com
2014-12-16 22:20:00

-----------

286
4@site.com
2014-12-16 19:40:41

-----------

287
5@site.com
2014-12-16 21:45:48

274
5@site.com
2014-12-15 23:04:34

275
5@site.com
2014-12-15 23:13:43
  • Вопрос задан
  • 3500 просмотров
Решения вопроса 2
FanatPHP
@FanatPHP
Чебуратор тега РНР
Кстати, текущий твой код прекрасно справляется с описанной задачей.
Теперь уже моя очередь удивляться. Может, тебе это надо?

$message = array();
while($row = mysql_fetch_assoc($result))
{
  if(!isset($message['email'])
  {
    $message[$row['email']] = array();
  }
  $message[$row['email']][] = $row;
}
var_dump($message);
Ответ написан
RusPOPsy
@RusPOPsy
Говорила мама, учи математику ...
$day1 = mktime(0, 0, 0, date("m"), date("d")-7, date("Y"));
$day2 = mktime(0, 0, 0, date("m"), date("d")-6, date("Y"));

$sql = "SELECT * FROM table WHERE UNIX_TIMESTAMP(createdon) > $day1 AND UNIX_TIMESTAMP(createdon) < $day2";
$result = mysql_query($sql);

$data = array();

while($row = mysql_fetch_assoc($result)) 
{
  if(!isset($data[$row['email']])){
     $data[$row['email']] = array();
  }
  $data[$row['email']][] = $row;
}
var_dump($data);
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
DmitriyEntelis
@DmitriyEntelis
Думаю за деньги
1. Делаем group by по пользователю которому шлем
2. Делаем group_concat по данным которые отправляем
Ответ написан
noys
@noys Автор вопроса
красноглазик
Юху!

два запроса но все таки удалось
всем спасибо за помощь, скомпоновав ваши решения удалось добиться желаемого результата, хоть и через одно место.

$day1 = mktime(0, 0, 0, date("m"), date("d")-7, date("Y"));
$day2 = mktime(0, 0, 0, date("m"), date("d")-6, date("Y"));

$sql = "SELECT *, GROUP_CONCAT(adid ORDER BY email SEPARATOR '|') as concat
	FROM table
	WHERE UNIX_TIMESTAMP(createdon) > $day1 AND UNIX_TIMESTAMP(createdon) < $day2
	GROUP BY email";

$result = mysql_query($sql);

while($row = mysql_fetch_assoc($result)) 
{

	$concatexp = explode('|', $row['concat']);

	foreach($concatexp as $id) {
	
		$sql2 = "SELECT id, email
			FROM table
			WHERE id = $id";

		$result2 = mysql_query($sql2);

		while($row2 = mysql_fetch_assoc($result2)) {
			$message[$row2['email']][] = $row2;
		}
	}
}
var_dump($message);
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы