#mysql #join
#mysql #Присоединиться
Вопрос:
Итак, у меня есть 2 таблицы, в которых нет ни одного общего столбца, и я хочу сохранить их по столбцу даты
Итак, table1 выглядит как:
table1
- ID
- post_id
- post_date
table2
- ID
- comment_id
- comment_date
я хочу показать все из table1, table2 и отсортировать это по дате
я попробовал что-то вроде
SELECT * FROM table1 INNER JOIN table2 ORDER BY post_date DESC, comment_date DESC
проблема в том, что я не знаю, как определить, какой элемент (запись или комментарий) я использую внутри while (rows = mysql_fetch_assoc()), поскольку у меня разные имена столбцов.
Решение было:
SELECT * FROM (
SELECT 1 AS `table`, `col1` AS `userid`, `col2` AS `cat`, `col3` AS `item_id`, `title` AS `title`, etc... , `date` AS `date` FROM `table1`
UNION
SELECT 2 AS `table`, `col1` AS `userid`, `col2` AS `cat`, `col3` AS `item_id`, NULL AS `title`, etc... , `date` AS `date` FROM `table2`
) AS tb
ORDER BY `date` DESC
Комментарии:
1. Опишите, я не знаю, как определить, какой элемент (сообщение или комментарий)
2. итак, допустим, в моей таблице1 есть несколько записей, но таблица2 по-прежнему равна нулю… как мне узнать, какие данные отображать? table1 или table2? поскольку у меня разные столбцы в обеих таблицах
3. В вашей теме говорится, что вы хотите объединить по дате, но ваш код объединяет по идентификатору. Для меня это не имеет смысла. Вообще. Чего именно вы хотите достичь?
4. поскольку я использую ORDER BY post_date DESC, comment_date DESC, не является ли это объединением 2 таблиц и отображением их по дате? я пытаюсь показать все записи из этих 2 таблиц по дате
5. Комментарии не связаны с сообщениями?
Ответ №1:
Попробуйте UNION
с новым постоянным столбцом, указывающим, какая таблица выводится, и сделайте имена столбцов одинаковыми, используя AS
.
Окружение SELECT
может позволить вам упорядочить их вместе.
SELECT * FROM (
(SELECT 1 AS `table`, `id`, `post_id` AS `table_id`, `post_date` AS `date` FROM `table1`)
UNION
(SELECT 2 AS `table`, `id`, `comment_id` AS `table_id`, `comment_date` AS `date` FROM `table2`)
)
ORDER BY `date` DESC
Это потребует тестирования, не уверен, разрешено ли это.
Комментарии:
1. приведенный выше код работает не так, как я хочу, я должен назначить все столбцы из 2 таблиц и иметь одинаковое имя ключа, например post_date = date и comment_date = date, что я хочу, так это проверить, из какой таблицы я получаю данные при каждом запуске цикла while (который извлекает данные). в любом случае спасибо.
2. @fxuser: Это то, что должно произойти с этим кодом. Вы используете
table
поле для определения источника. Поля унифицированы в соответствии с запросом.3. дело в том, что в одной таблице столбцы фактически не совпадают с другой таблицей, и у меня возникли проблемы с отображением данных… я попробую с union
4. @fxuser: Когда вы говорите, не совпадают? Что вы имеете в виду? Если вы имеете в виду, что нет общих полей, то
UNION
это то, что вам нужно. Если вы имеете в виду, что это разные типы данных, то вам придется выполнить какое-то преобразование или разделить данные.5. @fxuser, нет, ты этого не делаешь, просто укажите
, null as missing_field
в поле выбора для таблицы с отсутствующим полем.
Ответ №2:
Вам придется переделать свою базу данных, если вы хотите связать записи с комментариями.
Учитывая эти таблицы
table1
id
post_id
post_date
table2
id
comment_id
comment_date
И тот факт, что комментарии должны быть комментариями, принадлежащими сообщениям, вам нужно изменить таблицы, чтобы их структура стала:
table post
id /*id of a post*/
user_id /*which user posted this*/
post_date /*when?*/
post_text /*the text inside the post*/
table comments
id /*id of a comment*/
post_id /*which post does this comment belong to*/
user_id /*who posted this*/
comment_date /*when*/
comment_text /*text of the comment*/
Теперь вы можете объединить это, выполнив:
$post_id = mysql_real_escape_string($_GET['post_id']);
/*select all comments belonging to a post*/
$query = "SELECT c.user_id, c.comment_date, c.comment_text FROM posts p
INNER JOIN comments c ON (c.post_id = p.id)
WHERE p.id = '$post_id'";
....
В вашем текущем дизайне нет способа надежно объединить их, потому что между ними нет связи.
Комментарии:
1. я не совсем ясно выразился, эти 2 таблицы являются простым примером, я хочу показать их все в порядке убывания по дате добавления в базу данных, таблица1 может быть ссылками, таблица2 может быть tas и так далее, я просто хочу показать, как они убывают по дате добавления
2. @fxusers, @Orbling уже ответил на это, вы должны принять его ответ. Все еще ваш пример не имеет никакого смысла, домашнее задание?
3. это не домашнее задание, я просто создаю несколько сценариев для веб-приложения
Ответ №3:
SELECT * FROM (
SELECT 1 AS `table`, `col1` AS `userid`, `col2` AS `cat`, `col3` AS `item_id`, `title` AS `title`, etc... , `date` AS `date` FROM `table1`
UNION
SELECT 2 AS `table`, `col1` AS `userid`, `col2` AS `cat`, `col3` AS `item_id`, NULL AS `title`, etc... , `date` AS `date` FROM `table2`
) AS tb
ORDER BY `date` DESC