@Joker2705

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

Всем привет. Есть две таблицы, условно, table1 и table2. Структура table1: id, name1, name2, time, text. Структура table2: id, name1, name2, time, text. Т.е. они идентичные, но записываются в них разные данные. Подскажите, как мне средствами PHP и MySQLi сделать следующее:
1. Выбрать из table1 и table2 строки, содержащие непосторяющиеся данные в колонках name2.
2. Отсортировать эти данные по колонке time по убыванию.
3. Вывести эти данные на экран, но только так, что бы они не повторялись. Т.е. если time в table1 больше time в table2, то выводится text из table1, а если time в table1 меньше time в table2, то выводится text из table2.
  • Вопрос задан
  • 314 просмотров
Пригласить эксперта
Ответы на вопрос 3
@IceJOKER
Web/Android developer
Сам сталкивался с этой задачей, одним запросом данную задачу можно решить как-то так:
SELECT * FROM (SELECT * FROM table ...... ORDER BY `time_field`) GROUP BY `group_field);
- но в данном примере проблема возникла с LIMIT , если в подзапросе сделаю LIMIT, то после группировки может придти меньше данных.

Можно выборку сделать с помощью php, сначала выбрать одни данные, а потом в цикле другие данные.

p.s. буду очень благодарен, если кто-нибудь предложит решение по-лучше
Ответ написан
ThunderCat
@ThunderCat Куратор тега PHP
{PHP, MySql, HTML, JS, CSS} developer
Такие задачи мне кажется проще писать на хранимых процедурах, но там надо разбираться, с ходу решение не выдам, а самостоятельно разбираться - я думаю вы надолго застрянете.
Или как указал IceJOKER, получить таким образом 2 резалта и дальше средствами пхп. Типа такого

$res = array();
if(!empty($arr1)&&!empty($arr2)){
    foreach($arr1 as $a1){
        foreach($arr2 as $a2){
            if($a1['name'] == $a2['name']) {
                if ($a1['time'] < $a2['time']) {
                    $res[] = $a1;
                } else {
                    $res[] = $a2;
                }
                break;
            }
        }
    }
}
Ответ написан
@Joker2705 Автор вопроса
Все равно не пойму, подставил свои данные, а ничего не работает. Проверьте, пожалуйста и подскажите, что не так? Что еще дописать надо?

$tab1 = mysqli_query("SELECT * FROM table1 GROUP BY name1 ORDER BY time DESC");
$arr1 =  mysqli_fetch_array($tab1);
$tab2 = mysqli_query("SELECT * FROM table2 GROUP BY name2 ORDER BY time DESC");
$arr2 =  mysqli_fetch_array($tab2);
	
$res = array();
if(!empty($arr1)&&!empty($arr2)){
	foreach($arr1 as $a1){
		foreach($arr2 as $a2){
			if($a1['name1'] == $a2['name2']) {
				if ($a1['time'] < $a2['time']) {
					$res[] = $a1;
					$from=$res['name1'];
				} else {
					$res[] = $a2;
					$from=$res['name2'];
				}
				break;
			}
		}
	}
	echo "В $res[time] от $from: $res[text]";
}


Не выводятся строки. Как запихнуть это в цикл, что бы выводились все последние строки?

Заполнение таблиц примерно такое:
table1:
id | name1 | name2 | time | text
1 | user1 | user2 | 12.04.2016 : 09.40 | Привет
2 | user3 | user2 | 12.04.2016 : 09.42 | Как дела
3 | user4 | user2 | 12.04.2016 : 09.39 | Что делаешь?

table2:
id | name1 | name2 | time | text
1 | user2 | user1 | 12.04.2016 : 09.41 | Привет

Нужно что бы на экран вывелось:
В 12.04.2016 : 09.42 от user3: Как дела
В 12.04.2016 : 09.41 от user1: Привет
В 12.04.2016 : 09.39 от user4: Что делаешь?
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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