Соедините две таблицы, затем Упорядочите по дате, НО объедините обе таблицы - PullRequest
2 голосов
/ 12 марта 2011

Хорошо, я пытаюсь понять, почему я не могу понять, как это сделать хорошо ...

У меня есть две таблицы:

  • счетов :

    • id
    • ID пользователя
    • сумма
    • дата
  • платежи :

    • id
    • userID
    • сумма
    • дата

Итак, цель здесь состоит в том, чтобы объединить обе таблицы, где userID совпадает с тем, что я хочу, и затем вернуть все, упорядоченные по дате (самые последние вверху).Однако, поскольку в каждой из таблиц есть поле даты, я не уверен, как MySQL будет обрабатывать вещи ... будет ли сортироваться по обеим датам автоматически?Вот о чем я думал ...

"SELECT DISTINCT *
            FROM invoices,payments
            WHERE {$userID} = invoice.userID
            OR {$userID} = payments.userID
            ORDER BY date DESC";

Но мне становится ясно, что, возможно, это даже не правильное использование команды соединения ... возможно, мне нужно просто получить вседанные по каждой таблице отдельно, а затем попытаться как-то отсортировать с помощью PHP?Если это лучший метод, каков хороший способ сделать этот тип сортировки DATE, сохраняя все данные в такте?

Я должен добавить, TIME внутри метки времени unix (именно так хранится «date»)НЕ пренебрежимо мало - сортировать по дате и времени.

Спасибо всем ...

Ответы [ 3 ]

4 голосов
/ 12 марта 2011

Если столбцы обеих таблиц одинаковы, вы можете использовать UNION

SELECT X.*
  FROM ( SELECT `id`,
                `userID`,
                 'INVOICE' AS PTYPE
                 `amount`,
                 `date`
            FROM `invoices`
           WHERE {$userID} = userID  
          UNION
          SELECT `id`,
                 `userID`,
                 'PAYMENT' AS PTYPE
                 `amount`,
                 `date`
            FROM `payments`
           WHERE {$userID} = userID  
        ) X
 ORDER BY X.`date`

EDIT

Прочтите соответствующий раздел руководства MySQL на UNIONS. Есть другие способы сформулировать это, но это мой предпочтительный стиль - всем должно быть ясно, что выражение ORDER BY применяется к результату обеих сторон UNION. Неосторожно написанный UNION - даже с ORDER BY - может по-прежнему оставлять окончательный набор результатов в неопределенном порядке.

Цель PTYPE состоит в том, что этот запрос возвращает дополнительный столбец, называемый PTYPE, который указывает, является ли каждая отдельная строка счетом-фактурой или ПЛАТЕЖЕЙ ... т.е. с какой из двух таблиц это происходит. Это не обязательно, но часто может быть полезно в союзе

2 голосов
/ 12 марта 2011

Поскольку у вас есть два одинаковых поля с именем date, MySQL не будет знать, какое из них вы пытаетесь упорядочить.

"SELECT DISTINCT *
            FROM invoices,payments
            WHERE {$userID} = invoice.userID
            OR {$userID} = payments.userID
            ORDER BY invoices.date, payments.date DESC";

Это будет сортировать по дате выставления счета, а затем по дате платежа - если это то, что вы пытаетесь выяснить

0 голосов
/ 12 марта 2011

Если ваш тип данных Date, Timestamp или что-нибудь связанное, SGBD упорядочит его должным образом. Если это было то, что вы спросили.

Но если тип данных String, даже если даты хранятся, он не будет сортироваться так, как вы хотите.

...