Объединение запросов для разных результатов

У меня есть 3 запроса, выполнение которых занимает слишком много времени и загрузка результатов на страницу (slickgrid), поэтому я хочу оптимизировать его в один запрос с помощью объединений.

Я не могу понять, как этого добиться. Может ли кто-нибудь из вас рассказать мне, как получить один запрос из трех нижеприведенных запросов.

$ikt = $row['2'];
$id = $row['0'];
$record = $row['1'];


$sql2 = "SELECT * FROM `plant_records` WHERE IKT = '".$ikt."' AND Record='".$record."'";
$adddetails2    = mysql_query($sql2);
$recorddetails2 = mysql_fetch_assoc($adddetails2);
$num_rows3      = mysql_num_rows($adddetails2);
if ($num_rows3 > 0){
    $storeData[$i][] ='Filled';
 }
else{
    $storeData[$i][] ='Not Filled';
 }


$sql5= "SELECT * FROM `plant_overview` WHERE IKT = '".$ikt."' AND ID_Record='".$record."'";
$adddetails5    = mysql_query($sql5);
$recorddetails5 = mysql_fetch_assoc($adddetails5);
$num_rows6      = mysql_num_rows($adddetails5);
if ($num_rows6 > 0){
$storeData[$i][] ='Filled';
    }
else{
    $storeData[$i][] ='Notfilled';
}       


$sql3  = "SELECT * FROM `plant_info` WHERE TG_ID = $id and Present != '' ";
$adddetails3    = mysql_query($sql3);
$recorddetails3 = mysql_fetch_assoc($adddetails3);
$num_rows4      = mysql_num_rows($adddetails3);
if ($num_rows4 > 0){
    $storeData[$i][] ='Filled';
}
else{
    $storeData[$i][] ='Notfilled';
}   



 Status: listdata[i]['16'],
 Records: listdata[i]['17'],
 Checking: listdata[i]['18'],

Мне нужны результаты в разных списках данных, так как я должен показывать разные данные на основе этих результатов.

Редактировать

Вот мои структуры таблиц.

master_table

ID (int - PK)
Record (varchar)
IKT (varchar)

( The below are refering to the above table <br>
$ikt = $row['2'];
$id = $row['0'];
$record = $row['1'];
)

plant_records

ID (int - PK)
IKT (varchar)
Record (varchar)<
Student (varchar)
  • Если запись и IKT присутствуют в master_table, то «заполнено», иначе «не заполнено»

plant_overview

ID (int - PK)
IKT (varchar)
ID_Record (varchar)
Subject (varchar)
  • Если ID_Record и IKT присутствуют в master_table, то «заполнено», иначе «не заполнено»

plant_info

ID (int - PK)
TG_ID (int - this is refering to the ID column in master table)<br>
Present (varchar)
result (varchar)
  • Если TG_ID присутствует в master_table и Present не пуст, то «заполнено», иначе «не заполнено»

Вопрос 2 из комментариев: как я собираюсь использовать данные из разных списков данных

Ответ: В slickgrid у меня есть столбцы для Plant_Records, Plant_Overview, Plant_Info

на основе данных (заполнено / не заполнено) я буду показывать разные изображения в slickgrid

Например, в столбце Plant_Record в Slickgrid .. Если значение Filled, я буду отображать изображение A, если значение "Not fill", я буду отображать изображение B

В столбце Plant_overview в Slickgrid .. Если значение равно Filled, я буду отображать изображение C, если значение "Not fill" - изображение D.

Каждый раз, когда вы используете расширение базы данных mysql_ в новом коде Это случилось, оно устарело, было уже много лет и навсегда исчезло в PHP7.0 +. Если вы только изучаете PHP, потратьте свою энергию на изучение расширений базы данных PDO или mysqli и подготовленных операторов. Начните здесь

RiggsFolly 12.10.2018 11:16

Избегайте использования * в приложении. Это может доставить вам неприятности ..

dwir182 12.10.2018 11:16

Было бы полезно увидеть схему для этих трех таблиц.

RiggsFolly 12.10.2018 11:19

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

RiggsFolly 12.10.2018 11:20

Поскольку ваше требование объединить эти запросы, похоже, противоречит вашему комментарию о необходимости результатов в различных элементах listdata, можете ли вы объяснить, как эти данные будут использоваться после выбора из базы данных.

RiggsFolly 12.10.2018 11:25

@RiggsFolly, Спасибо за ваше предложение в первом комментарии, я выучу его. Я добавил структуры таблиц в свой вопрос и ответил на ваш последний комментарий. Не могли бы вы взглянуть на это.

John 12.10.2018 11:39

Вы отметили oracle. Вы уверены, что используете базу данных Oracle? Похоже, вы используете MySQL, которая является другой СУБД. (Разрешает ли mysql_query доступ к СУБД Oracle?)

Thorsten Kettner 12.10.2018 17:35
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
7
69
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Все, что вы хотите сделать, это проверить, существуют ли совпадения в таблицах? Вы бы сделали это с EXISTS или IN.

С условиями EXISTS:

select 
  id, record, ikt,
  case when exists (select * from plant_records pr where pr.ikt = mt.ikt and pr.record= mt.record)
       then 'Filled' else 'Not filled' end as pr_filled,
  case when exists (select * from plant_overview po where po.ikt = mt.ikt and po.record= mt.record)
       then 'Filled' else 'Not filled' end as po_filled,
  case when exists (select * from plant_info pi where pi.tg_id = mt.id and pi.present <> '')
       then 'Filled' else 'Not filled' end as pi_filled
from master_table mt;

С предложениями IN:

select 
  id, record, ikt,
  case when (ikt, record) in (select ikt, record from plant_records)
       then 'Filled' else 'Not filled' end as pr_filled,
  case when (ikt, record) in (select ikt, record from plant_overview)
       then 'Filled' else 'Not filled' end as po_filled,
  case when (id) in (select tg_id from plant_info where present <> '')
       then 'Filled' else 'Not filled' end as pi_filled
from master_table;

Добавьте where id = $id, если вы хотите, чтобы это было только для одной строки.

У вас должны быть следующие индексы:

create index idx1 on plant_records (ikt, record);
create index idx2 on plant_overview (ikt, record);
create index idx3 on plant_info (tg_id, present);
create index idx4 on plant_info (present, tg_id);

Будет использоваться только idx3 или idx4. Вы можете проверить, какой из них, и опустить другой. (Конечно, может случиться так, что СУБД не использует какие-либо индексы. Это просто предложение. СУБД должна решить, использовать их или нет.)

Запрос Exists работает нормально, но как использовать их в списке данных? Статус: listdata [i] ['16'], Записи: listdata [i] ['17'], Проверка: listdata [i] ['18'], как это (размещено в самом вопросе раньше ... извините, если вы пропустили это) .. Я хочу, чтобы результат был в каждом списке данных. Есть идеи, как это сделать

John 16.10.2018 14:20

Я работал над этим дальше, и теперь все в порядке. Спасибо большое за вашу помощь.

John 19.10.2018 11:41

Другие вопросы по теме