Логическая проблема с двумя таблицами

0

Привет, ребята, я создал список для светильников.

$result = mysql_query("SELECT date FROM ".TBL_FIXTURES." WHERE compname = '$comp_name' GROUP BY date");
    $i = 1;
    $d = "Start";
    while ($row = mysql_fetch_assoc($result)) 
    {
        $odate = $row['date'];
        $date=date("F j Y", $row['date']);
        echo "<p>Fixture $i - $d to $date</p>";
    }

Как вы можете видеть из запроса, дата отображается в таблице приборов. Способ, которым работает моя система, заключается в том, что когда "проигрывается", он удаляется из этой таблицы. Поэтому, когда весь раунд светильников завершен, в этой таблице не будет никаких дат для этого раунда. Они будут в другой таблице.

В любом случае я могу запустить другой запрос для дат одновременно и отображать только даты из таблицы приборов, если в таблице результатов отсутствует дата?

"SELECT * FROM ".TBL_CONF_RESULTS." 
                               WHERE compid = '$_GET[id]' && type2 = '2' ORDER BY date" 

Это будет второй запрос!

ИЗМЕНИТЬ ИЗ ЗДЕСЬ ВНУТРЕННИЕ...

В любом случае, я могу выбрать дату из двух таблиц, а затем использовать только одну, если есть совпадения. Затем используйте строки дат (GROUPED BY) для заполнения моего запроса? Возможно ли это?

Теги:

5 ответов

2
Лучший ответ

Похоже, вы хотите, чтобы UNION установили два набора результатов, похожие на следующие:

SELECT f.date FROM tbl_fixtures f
WHERE f.compname = '$comp_name'
UNION SELECT r.date FROM tbl_conf_results r
WHERE r.compid = '$_GET[id]' AND r.type2 = '2'
GROUP BY date

Это должно выбрать f.date и добавить строки из r.date, которые еще не находятся в наборе результатов (по крайней мере, это поведение с T-SQL). По-видимому, он может плохо масштабироваться, но на нем много блогов (поиск: UNION T-SQL).

  • 0
    Это оно. Я просто не знал о UNION! Я изменил GROUP BY на ORDER BY, так как это было ошибкой в моем исходном запросе. Спасибо большое, чувак, действительно очень полезно!
  • 0
    Мне было интересно о странности этого предложения GROUP BY ;-)
1

Кажется, что вы хотите получить UNION запрос.

$q1 = "SELECT DISTINCT date FROM ".TBL_FIXTURES." WHERE compname = '$comp_name'";
$q2 = "SELECT DISTINCT date FROM ".TBL_CONF_RESULTS. 
      "WHERE compid = '$_GET[id]' && type2 = '2'";

$q = "($q1) UNION DISTINCT ($q2) ORDER BY date";
  • 0
    Похоже, это также будет работать. Было два ответа UNION, и я только что видел этот. Спасибо за помощь, приятель.
1
  • WHERE compid = '$_GET[id]' представляет возможность для SQL Injection.
  • TBL_FIXTURES и TBL_CONF_RESULTS должны читать $TBL_FIXTURES и $TBL_CONF_RESULTS?
  • 0
    Я хотел бы представить, что TBL_FIXTURES является define() или const
  • 0
    Оба определены ...
1

ChrisF имеет решение!

Еще одна вещь, о которой вы могли бы подумать, - это сделать удаление и перейти к другой таблице. Обычным способом решения этой проблемы является включение поля состояния для каждой записи, а не просто запрос на "все", которые вы запрашиваете для всех, где status = "x". Например, 1 может быть "промежуточным", 2 может быть "использован", 3 может быть "использован" или "архивирован". В вашем примере вместо удаления поля и "перемещения" записи в другую таблицу (что также должны произойти в цикле foreach, можно было бы предположить), вы могли бы просто обновить поле состояния до следующего состояния.

Итак, вы устранили необходимость в дополнительной таблице, удалили бы один дополнительный байт на каждую запись и теоретически улучшили бы производительность своего приложения.

  • 0
    +1 за предложение лучшего дизайна БД в качестве решения :)
  • 0
    Аааа, лучший дизайн базы данных мог бы стать вариантом. Однако у ChrisF нет решения из-за следующего. Мне нужно проверить даты из двух таблиц. Тогда я могу сгруппировать даты и использовать их. Как я могу это сделать? Где взять даты из двух таблиц, если есть дубликаты, использовать только один раз?
1

Из примечаний эта страница:

//performs the query
$result = mysql_query(...);

$num_rows = mysql_num_rows($result);

//if query result is empty, returns NULL, otherwise,
//returns an array containing the selected fields and their values
if($num_rows == NULL)
{
    // Do the other query
}
else
{
    // Do your stuff as now
}
  • 0
    Я не думаю, что это сработает. Он будет возвращать строки, но не достаточно строк. Скажем, у меня 4 команды в лиге, у меня 3 раунда матчей. Когда первый раунд матчей покидает таблицу фикстур, тогда мне нужен другой запрос, чтобы заполнить дату. Но запрос все равно будет возвращать строки, так как второй и третий раунд фикстур все еще там. Поэтому я думаю, что если я проверю таблицу результатов на дату, если есть строки, сравните их с таблицей фикстур. Затем верните только одну строку, если есть 2 одинаковых строки, в противном случае верните одну из приборов.
  • 0
    @Luke - я, должно быть, неправильно прочитал твой вопрос - однако ты не можешь все еще использовать переменную $num_rows ?
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню