Перекрестная ссылка на запрос MySQL - PullRequest
0 голосов
/ 09 марта 2012

Я ищу запрос mysql (использующий php), чтобы просмотреть каждую таблицу по одному и отображать только результаты, отличные от тех, которые указаны в cross_check.lastmod

t_one

guid | name | lastmod
 1   |  Joe | 2012-01-01 01:00:00
 2   |  Tom | 2012-01-02 01:00:00
 3   |  Sue | 2012-03-01 02:00:00

t_two

guid | pet  | lastmod
 4   | cat  | 2012-01-01 01:00:00
 5   | dog  | 2012-01-02 01:00:00
 6   | fish | 2012-03-01 02:00:00

t_three

guid | fruit   | lastmod
 7   |  orange | 2012-01-01 01:00:00
 8   |  pear   | 2012-01-02 01:00:00
 9   |  grape  | 2012-03-01 02:00:00

cross_check

guid | lastmod
   1 |  2012-01-01 01:00:00
   2 |  2012-01-02 01:00:00
   3 |  2012-01-01 02:00:00
   4 |  2012-01-01 01:00:00
   5 |  2012-01-02 01:00:00
   6 |  2012-01-01 02:00:00
   7 |  2012-01-01 01:00:00
   8 |  2012-01-02 01:00:00
   9 |  2012-01-01 02:00:00

Результаты запроса будут такими:

t_one => 3 | Sue   | 2012-03-01 02:00:00
t_two => 6 | fish  | 2012-03-01 02:00:00
t_three => 9 | grape | 2012-03-01 02:00:00

Пока мой код (нужна перекрестная ссылка на таблицу)

$tables = array('t_one', 't_two', 't_three');

  foreach ($tables AS $table) {

    $query = sprintf("SELECT * FROM '%s'",
    mysql_real_escape_string($table));

    $result = mysql_query($query);

  }

Ответы [ 2 ]

4 голосов
/ 09 марта 2012

Просто JOIN в таблице cross_check.

SELECT t_one.*
FROM t_one
JOIN cross_check ON t_one.guid=cross_check.guid
WHERE t_one.lastmod != cross_check.lastmod

Тем не менее, по-прежнему один запрос на таблицу (можно объединяться с объединениями, но это не уменьшает основное количество запросов).

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

[query for t_one]
 UNION
[query for t_two]
 UNION
[query for t_three]

Я чувствую, что это не так уж и эффективно, как выполнение трех разных запросов (хотя это внутреннее чувство, необоснованное утверждение).

Вы также можете это сделать (хотя это работает только в том случае, если между t_* guid с нет перехода; если есть t_one, то предпочтение будет отдано t_two):

SELECT COALESCE(t_one.guid,t_two.guid,t_three.guid) AS guid
FROM cross_check
LEFT JOIN t_one ON t_one.guid=cross_check.guid 
LEFT JOIN t_two ON t_two.guid=cross_check.guid
LEFT JOIN t_three ON t_three.guid=cross_check.guid
WHERE (t_one.lastmod IS NOT NULL AND t_one.lastmod != cross_check.lastmod)
   OR (t_two.lastmod IS NOT NULL AND t_two.lastmod != cross_check.lastmod)
   OR (t_three.lastmod IS NOT NULL AND t_three.lastmod != cross_check.lastmod)

Вы также можете поставить COALESCE(t_one.name, t_two.pet, t_three.fruit) AS label, если хотите захватить ярлыки, а не идентификаторы.

0 голосов
/ 09 марта 2012

Попробуйте использовать этот запрос, заменив, конечно, имя таблицы в цикле foreach.

SELECT origin.guid as guid FROM t_one as origin, cross_check as cross WHERE cross.lastmod != origin.lastmod;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...