Объединение запросов для разных результатов - PullRequest
0 голосов
/ 12 октября 2018

У меня есть 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)
  • If Record и 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

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

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

InСтолбец Plant_overview в Slickgrid. Если значение заполнено, я буду отображать изображение C, если значение «Не заполнено», я буду отображать изображение D.

1 Ответ

0 голосов
/ 12 октября 2018

Все ли вы хотите проверить, есть ли совпадения в таблицах?Вы бы сделали это с 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.Вы можете проверить, какие и бросить другие.(Конечно, может случиться, что СУБД не использует ни один из индексов. Это просто предложение. СУБД должна решить, использовать их или нет.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...