Как мне сделать этот огромный разделенные запросы в один запрос

0

У меня разные запросы, получаемые из разных таблиц на одной странице. Я хочу отключить отключение базы данных.

вот мой код..

$query = "SELECT COUNT(*) as cnt_news FROM news";
$result = mysql_query($query);
$row = mysql_fetch_array($result);


$query = "SELECT COUNT(*) as cnt_adv FROM advertisements";
$result = mysql_query($query);
$row = mysql_fetch_array($result);

$query = "SELECT COUNT(*) as cnt_comm FROM comments";
$result = mysql_query($query);
$row = mysql_fetch_array($result);


$query = "SELECT SUM(CASE WHEN c.approve = '1' AND c.spam = '0' THEN 1 ELSE 0 END) AS cnt_approved,
          SUM(CASE WHEN c.approve = '0' AND c.spam = '0' THEN 1 ELSE 0 END) AS cnt_unapproved,
          SUM(CASE WHEN c.spam = '1' THEN 1 ELSE 0 END) AS cnt_spam
          FROM COMMENTS c";
$result = mysql_query($query);
$row = mysql_fetch_array($result);


$query = "SELECT SUM(a.amount) as t_amnt,
          SUM(a.cashpaid) as t_cpaid,
          SUM(a.balance) as t_bal
          FROM advertisements a";
$result = mysql_query($query);
$row = mysql_fetch_array($result);

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

спасибо.

Теги:

3 ответа

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

Вам не нужно прерывать работу с базами данных, но вы можете вырезать свой код с помощью функции

Чтобы сделать функцию общего назначения, было бы лучше.

<?php
$num_news = dbgetvar("SELECT COUNT(*) FROM news");
$num_adv  = dbgetvar("SELECT COUNT(*) FROM advertisements");
$num_comm = dbgetvar("SELECT COUNT(*) FROM comments");

function dbgetvar($query){
  $res = mysql_query($query);
  if (!$res) {
    trigger_error("dbget: ".mysql_error()." in ".$query);
    return FALSE;
  }
  $row = mysql_fetch_row($res);
  if (!$row) return NULL;
  return $row[0];
}

всегда выполняет функцию из повторяющегося кода.

  • 1
    Насколько это будет полезно, если я использую функцию? не плохо ли совершать частые поездки в базу данных? хотя я буду использовать все значения из запроса каждый раз на странице, и значение не будет NULL в любой данный момент времени.
  • 1
    Функции @Ibrahim ВСЕГДА полезны для сокращения кода. И нет, это не плохо делать частые поездки в базу данных. Это как если бы вы спросили "это плохо часто ездить на машине?" Базы данных предназначены для извлечения данных. Ничего плохого в таких поездках.
Показать ещё 4 комментария
1

Вы можете обратиться к библиотеке mysqli вместо библиотеки mysql для подключения к MySQL. Использование mysqli::multi_query для одновременного запуска нескольких запросов и получения результатов.

Почти все функции mysql_ доступны как функции mysqli_:

<?php
$link = mysqli_connect("localhost", "user", "password", "dbname");

/* check connection */
if (mysqli_connect_errno())
{
    printf("Connect failed: %s\n", mysqli_connect_error());
    exit();
}

//these are your queries. Put them all in a string separated by semicolon ;
$query  = "SELECT COUNT(*) as cnt_news FROM news;";
$query .= "SELECT COUNT(*) as cnt_adv FROM advertisements;";
$query .= "SELECT COUNT(*) as cnt_comm FROM comments;";

// Now execute multi query
if (mysqli_multi_query($link, $query))
{
    do {
        /* store first result set */
        if ($result = mysqli_store_result($link))
        {
            while ($row = mysqli_fetch_row($result))
            {
                printf("%s\n", $row[0]);
            }
            mysqli_free_result($result);
        }
        /* print divider */
        if (mysqli_more_results($link)) {
            printf("-----------------\n");
        }
    } while (mysqli_next_result($link));
}

/* close connection */
mysqli_close($link);
?>

Я привел пример только для трех ваших запросов. Вы можете добавить больше запросов в $query. Таким образом, MySQL будет иметь один запрос.

  • 0
    код выглядит просто потрясающе, но для этого проекта я не хочу использовать mysqli, я обязательно рассмотрю его использование для следующего проекта. спасибо за этот код. :)
1
$query = "SELECT
COUNT(n.*) as cnt_news,
COUNT(a.*) as cnt_adv,
COUNT(c.*) as cnt_comm,
SUM(CASE WHEN c.approve = '1' AND c.spam = '0' THEN 1 ELSE 0 END) AS cnt_approved,
    SUM(CASE WHEN c.approve = '0' AND c.spam = '0' THEN 1 ELSE 0 END) AS cnt_unapproved,
    SUM(CASE WHEN c.spam = '1' THEN 1 ELSE 0 END) AS cnt_spam,
SUM(a.amount) as t_amnt,
    SUM(a.cashpaid) as t_cpaid,
    SUM(a.balance) as t_bal
FROM
news n, advertisements a, comments c";

Это должно сделать это в одном запросе.

  • 0
    так мило, теперь я вижу, насколько полезным может быть псевдоним, попробую это :)
  • 1
    @ Ибрагим, ты поймешь, как это ужасно, когда через некоторое время тебе придется снова читать этот код. Помещение разных фрагментов кода в один массивный сплошной блок называется обфускацией и затрудняет чтение. Хотя читаемость кода очень важная вещь. Код не должен быть сокращен любой ценой. Но я понимаю, что вы не можете увидеть это без определенного опыта. Все в порядке, вы узнаете это в конце концов :)
Показать ещё 3 комментария

Ещё вопросы

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