Поэтому я работаю с клиентом, чтобы реализовать систему, аналогичную «системе значков и привилегий» в 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?
}
}
?>
Добавьте еще один столбец в набор результатов. В этом новом столбце заполните его из обоих запросов … похоже, это будет 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'];
}
Вот как бы я это сделал.
Других решений пока нет …