У меня есть 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)
plant_overview
ID (int - PK)
IKT (varchar)
ID_Record (varchar)
Subject (varchar)
plant_info
ID (int - PK)
TG_ID (int - this is refering to the ID column in master table)<br>
Present (varchar)
result (varchar)
Вопрос 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.
Избегайте использования * в приложении. Это может доставить вам неприятности ..
Было бы полезно увидеть схему для этих трех таблиц.
Я предполагаю, что вы проверили, что у вас есть полезные индексы по соответствующим столбцам.
Поскольку ваше требование объединить эти запросы, похоже, противоречит вашему комментарию о необходимости результатов в различных элементах listdata, можете ли вы объяснить, как эти данные будут использоваться после выбора из базы данных.
@RiggsFolly, Спасибо за ваше предложение в первом комментарии, я выучу его. Я добавил структуры таблиц в свой вопрос и ответил на ваш последний комментарий. Не могли бы вы взглянуть на это.
Вы отметили oracle. Вы уверены, что используете базу данных Oracle? Похоже, вы используете MySQL, которая является другой СУБД. (Разрешает ли mysql_query доступ к СУБД Oracle?)






Все, что вы хотите сделать, это проверить, существуют ли совпадения в таблицах? Вы бы сделали это с 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'], как это (размещено в самом вопросе раньше ... извините, если вы пропустили это) .. Я хочу, чтобы результат был в каждом списке данных. Есть идеи, как это сделать
Я работал над этим дальше, и теперь все в порядке. Спасибо большое за вашу помощь.
Каждый раз, когда вы используете расширение базы данных
mysql_в новом коде Это случилось, оно устарело, было уже много лет и навсегда исчезло в PHP7.0 +. Если вы только изучаете PHP, потратьте свою энергию на изучение расширений базы данныхPDOилиmysqliи подготовленных операторов. Начните здесь