Есть ли способ объединить запросы MySQL или дать им последовательность для оптимизации? - PullRequest
0 голосов
/ 08 февраля 2019

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

("Составная таблица »- это то, что я называю таблицей, которая содержит два первичных ключа, которые оба являются ссылкой на первичный ключ в другой таблице, потому что я не знаю правильный термин)

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

Вот некоторые из вещей, которые я пробовал.

select t1.a AS EID, t2.a AS CID, t3.a AS IID from (select ID as a from Events where event = "test3") as t1, (select ID as a from Coordinates where Coordinates = "10.22,14.15") as t2, (select ID as a from Intervals where Interval = "From 12:15 To 18:30") as t3;

SELECT ID AS eid FROM Events WHERE event = "test3" UNION ALL SELECT ID AS cid FROM Coordinates WHERE Coordinates = "10.22,14.15" UNION ALL SELECT ID AS iid FROM Intervals WHERE Interval = "From 12:15 To 18:30"

И это то, чем я сейчас занимаюсь

if(!empty($this->event) && $this->event!== false){
        $sql = "SELECT ID FROM Events WHERE event = ?";
        $values = array($this->event);
    $db->setQuery($sql, $values);
    $db->singleFetch();

    if($db->getResults() == 1){
        $eid = $db->getFetch()[0]['ID'];
    }
    else{
        $sql = "INSERT INTO Events (event, Description) VALUES (?, ?)";
        $values = array($this->event, $this->description);
        $db->setQuery($sql, $values);
        $db->singleQuery();
        $eid = $db->getLast();
    }
}
//I am doing this for all three main tables,
//to get the ids needed for me to be able to do this.

if(isset($eid) && isset($cid)){
    $sql = "SELECT count(*) FROM EC WHERE EID = ? AND CID = ?";
    $values = array($eid, $cid);
    $db->setQuery($sql, $values);
    $db->singleFetch();
    if($db->getFetch()[0]['count(*)'] == 0){
        $sql = "INSERT INTO EC (EID, CID) VALUES (?, ?)";
        $values = array($eid, $cid);
        $db->setQuery($sql, $values);
        $db->singleQuery();
    }
}
//Which i then do for both composite tables

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

1 Ответ

0 голосов
/ 08 февраля 2019

Для этого вы можете написать хранимую процедуру в MySQL, а затем вам нужно вызвать эту хранимую процедуру

...