Эхо-данные SQL в порядке добавления даты с использованием Union All

Поэтому я работаю с клиентом, чтобы реализовать систему, аналогичную «системе значков и привилегий» в StackExchange. Хотя в ее системе, она стремится использовать очки и вознаграждения для своих сотрудников. Это тот же основной принцип. Пользователи получают вознаграждение за хорошую командную работу и получают вознаграждение от этих очков. Я подумал, что было бы удобно добавить такую ​​же функцию, которую SE использует для отображения их в верхней навигационной панели, где она отображает ваши репутацию и значки в порядке даты, которую вы заработали. Это моя проблема, я нашел помощь в извлечении данных из двух отдельных таблиц, но не уверен, как я буду отображать эти результаты в порядке заработанной даты? В качестве примера:

User ID #1 has earned 50 points on 18/12/2015 будет в ap_user_points Таблица

User ID #1 has earned 'The Gift Voucher' reward on '17/12/2015'

Если я просто:

echo $row8['reward'] . $row8['points_added']

Это будет звучать как:

The Gift Voucher 50

Где мне это нужно в порядке по дате, как:

50

The Gift Voucher

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

            <?php
$user_id = $_SESSION['userid'];
$sql8 = "SELECT r.reward_id,
r.user_id,
r.reward as reward,
r.date_earned as date_earned,
r.badge_desc,

NULL AS points_added,
NULL AS added_for,
NULL AS date_added
FROM ap_user_rewards as r
WHERE r.user_id = '$user_id'

UNION ALL

SELECT NULL,
NULL,
NULL,
NULL,
NULL,

p.points_added AS points_added,
p.added_for AS added_for,
p.date_added AS date_added
FROM ap_user_points as p
WHERE p.user_id = '$user_id' ORDER BY date_earned DESC, date_added DESC;";

$result8 = $conn->query($sql8);

if ($result8->num_rows > 0) {
// output data of each row
while($row8 = $result8->fetch_assoc()) {


////// NOT SURE WHAT TO ECHO HERE?

}
}
?>

0

Решение

Добавьте еще один столбец в набор результатов. В этом новом столбце заполните его из обоих запросов … похоже, это будет date_added выражение в первом запросе и date_earned Выражение во втором запросе. Когда они находятся в одном столбце, то упорядочить легко. (Это также предполагает, что эти выражения имеют одинаковые или совместимые типы данных, предпочтительно DATE, DATETIME или TIMESTAMP.)

Затем вы можете заказать по порядковой позиции, например, ORDER BY 2 упорядочить по второму столбцу в наборе результатов.

SELECT a1
, b1
, NULL
, NULL
, a1 AS sortexpr
FROM ...
UNION ALL
SELECT NULL
, NULL
, x2
, y2
, x2 AS sortexpr
FROM ...
ORDER BY 5 DESC

Это только одна возможность. Если вы не можете добавить дополнительный столбец, чтобы выстроить выражения из двух запросов, вам нужен способ определить, какой запрос возвращает строку. Я обычно включаю литерал в качестве столбца дискриминатора.

Тогда вы можете использовать синтаксис UNION в неявном стиле, оборачивая запросы в скобки …

( SELECT 'q1' AS `source`
, a1
, b1   AS date_earned
, NULL
, NULL AS date_added
FROM ...
)
UNION ALL
( SELECT 'q2'  AS `source`
, NULL
, NULL  AS date_earned
, x2
, y2    AS date_added
FROM ...
)
ORDER BY IF(`source`='q1',date_earned,date_added) DESC

Следовать за

Возможно, я неправильно понял вопрос. Я думал, что вопрос в том, как получить строки из UNION / UNION ALL, возвращенные в определенном порядке.

Лично я написал бы запрос, чтобы включить столбец дискриминатора, а затем выстроил столбцы настолько, насколько мог, чтобы они обрабатывались одинаково.

В качестве примера:

SELECT 'reward'        AS `source`
, r.date_earned   AS `seq`
, r.user_id       AS `user_id`
, r.date_earned   AS `date_earned`
, r.reward_id
, r.reward
, r.badge_desc
, NULL            AS `points_added`
, NULL            AS `added_for`
FROM r ...

UNION ALL

SELECT 'points'        AS `source`
, p.date_added    AS `seq`
, p.user_id       AS `user_id`
, p.date_added    AS `date_earned`
, NULL
, NULL
, NULL
, p.points_added  AS `points_added`
, p.added_for     AS `added_for`
FROM p ...

ORDER BY 2 DESC, 1 DESC

(Вероятно, нет необходимости возвращать user_id, поскольку мы уже знаем, какова будет стоимость. Я вернул его сюда, чтобы продемонстрировать, как можно «выстроить» столбцы из двух наборов результатов.)

Затем, когда я взял строки …

  if ( $row8['source'] == 'points' )  {

# process columns from a row of 'points' type
echo $row8['badge_desc'];
echo $row8['user_id'];

} elsif ( $row8['source'] == 'reward' )  {

# process columns from a row of 'reward' type
echo $row8['added_for'];
echo $row8['user_id'];

}

Вот как бы я это сделал.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]