ВЫБЕРИТЕ из двух таблиц, ГДЕ разные столбцы в каждой таблице равны $ id ORDER BY общего столбца (PHP / MySQL) - PullRequest
0 голосов
/ 17 августа 2011

Я пытаюсь выбрать из двух таблиц и даты ORDER BY (столбец у них обоих). Одна таблица (tableA) имеет столбец с именем «A», а другая таблица (tableB) имеет столбец с именем «B», я использую array_key_exists (), чтобы различать два (если существует ключ «A», я запускаю массив через FunctionA (), если ключ «B» существует, я запускаю массив через FunctionB ()). Мне нужны только 20 последних (по дате) записей. Мне нужен SQL-запрос для этого.

Я уже знаю, что ответ будет «если они имеют одинаковую структуру, то вам следует просто использовать одну таблицу», но я не хочу этого делать, потому что tableA кардинально отличается от tableB (гораздо больше столбцов в tableA), и использование единственной таблицы для хранения данных приведет к МНОЖЕ пустых столбцов для записей, отформатированных для tableB, не говоря уже о том, что это будет очень уродливый формат таблицы, поскольку tableB не будет нуждаться в большинстве столбцов tableA) .

Я просто хочу отображать данные из обеих таблиц упорядоченным (по дате) способом и в одном потоке.

Мне нужно ВЫБЕРИТЬ, ГДЕ tableA.poster_id = $ id и tableB.receiver_id = $ id, кстати.

РЕШЕНИЕ:

Я обновляю это на тот случай, если кто-то другой с такой же дилеммой придет. После реализации SQL-запроса, который любезно дал мне @Erik A. Brandstadmoen, мой код закончился так:

$MySQL->SQL("SELECT * FROM
              (SELECT A.id AS id, A.date AS date, 'tableA' AS source 
                 FROM tableA A WHERE A.poster_id = $id 
                    UNION
                      SELECT B.id AS id, B.date AS date, 'tableB' AS source
                           FROM tableB B WHERE B.receiver_id = $id) AS T
                               ORDER BY T.date DESC LIMIT 0, 20");

$GetStream = array();
$i = 0;
while ($row = mysql_fetch_array($MySQL->Result))
{
    $GetStream[$i]['id'] = $row['id'];
    $GetStream[$i]['date']=$row['date'];
    $GetStream[$i]['source'] = $row['source'];
    $i++;
}

*** later on down the code ***

$i = 0;
while ($i<count($GetStream))
{
    if ($GetStream[$i]['source'] == "tableA")
    { 
        FunctionA($GetStream[$i]);
    }
    else
    {
        FunctionB($GetStream[$i]);
    }
    $i++;
}

1 Ответ

2 голосов
/ 17 августа 2011

Попробуйте использовать UNION:

SELECT * FROM (
SELECT A.col1 AS x, A.col2 As y, A.col3 AS date FROM tableA A
WHERE tableA.poster_id = $id
UNION 
SELECT B.colA AS x, B.colB AS y, B.colC AS date FROM  tableB B
WHERE tableB.receiver_id = $id
)
ORDER BY date DESC
LIMIT 0, 20

ИЛИ, если вы хотите сохранить дубликаты между таблицей A и таблицей B, используйте UNION ALL.

РЕДАКТИРОВАТЬ, согласно вашим комментариям, я понимаю, что вам нужен столбец, указывающий, из какой таблицы эта строка. Вы можете просто добавить статический столбец в выборку, например так:

SELECT * FROM (
SELECT A.col1 AS x, A.col2 As y, A.col3 AS date, 'A' as source FROM tableA A
WHERE tableA.poster_id = $id
UNION 
SELECT B.colA AS x, B.colB AS y, B.colC AS date, 'B' as source FROM  tableB B
WHERE tableB.receiver_id = $id
)
ORDER BY date DESC
LIMIT 0, 20

Это дает вам хорошую таблицу в следующей форме:

x    y    date    source
=========================
(v1) (v2) (d1)    'A'
(v3) (v4) (d2)    'B'
(v1) (v2) (d3)    'B'
(v3) (v4) (d4)    'A'

Это делает то, что вы хотите, не так ли? Немного трудно понять, чего вы на самом деле пытаетесь достичь с помощью этого ...

...