MySQL ПРИСОЕДИНЯЙТЕСЬ к таблице или другому [дубликату]

0

Контекст:
База данных о телефонах. У меня есть поисковая система в TABLE sav (записи "послепродажное обслуживание"), в котором есть полевой phone содержащий IMEI (его уникальный идентификатор) телефона.
В некоторых случаях телефон возвращается в наш запас (удаляется из TABLE sales и добавляется в TABLE stock), а другой телефон возвращается клиенту.

Выпуск:
В поисковой системе "послепродажного обслуживания" я использую LEFT JOIN sales, но в случае, если телефон вернулся на stock, он не будет найден его IMEI.

Подвести:

Мне нужно присоединиться к таблице, если запись найдена, иначе присоединиться к другой таблице.

Мой фактический запрос:
Я сократил его ([...]), чтобы сделать его доступным для чтения:

SELECT sav.id, sav.phone, [...] FROM sav 
LEFT JOIN sales ON (sav.phone = sales.imei)
LEFT JOIN stock_model ON (sales.model = stock_model.id) [...]
WHERE (sales.imei LIKE :search_1 OR [...])
OR (sales.imei LIKE :search_2 OR [...])
OR [...]

Мне нужно изменить вторую строчку, но я не понимаю, как это сделать. Вопросы, которые я читал раньше, кажутся ответами на конкретные случаи.

EDIT: структура таблицы и фиктивные данные
Я не буду публиковать ненужные поля (слишком много)
TABLE sav

| id | phone     | issue   | replacement_imei | ...
----------------------------------------------------
| 35 | 123456789 | battery | NULL             | ...     <-- phone n°1
| 54 | 987654321 | screen  | 147258369        | ...     <-- phone n°2 replaced by phone n°3

TABLE stock

| id  | imei      | model | color | memory | ...
-------------------------------------------------
| 68  | 369258147 | 2     | 4     | 1      | ...
| 92  | 987654321 | 5     | 8     | 3      | ...     <-- phone n°2 replaced by phone n°3

TABLE sales

| id  | imei      | model | color | memory | ...
-------------------------------------------------
| 68  | 123456789 | 2     | 4     | 1      | ...     <-- phone n°1
| 103 | 147258369 | 5     | 8     | 3      | ...     <-- phone n°3 replaced phone n°2

EDIT: полная поисковая система [PHP]:
В случае, если вся функция помогает:

$keywords = explode(" ", $keywords);
$query = "SELECT sav.id, sav.phone, sav.date, sav.nom, sav.issue, sav.replacement_imei, sav.commentaire, sav.attente, sav.pieces, sav.frais, sav.date_envoi, sav.tracking, sav.termine FROM sav LEFT JOIN sales ON (sav.phone = sales.imei) LEFT JOIN stock_memory ON (sales.memory = stock_memory.id) LEFT JOIN stock_color ON (sales.color = stock_color.id) LEFT JOIN stock_model ON (sales.model = stock_model.id) LEFT JOIN stock_grade ON (sales.grade = stock_grade.id) WHERE ";

// Makes a long query returning each row where at least 1 keyword matches 1 column
$query_array = array();
    for ($i = 0; $i < count($keywords); $i += 1) {
        $query .= " ( sales.imei LIKE :search_" . $i;
        $query .= " OR ( sales.snowden = 1 AND 'snowden'= :search_" . $i . " )";
        $query .= " OR stock_model.name LIKE :search_" . $i;
        $query .= " OR stock_color.name LIKE :search_" . $i;
        $query .= " OR stock_memory.amount LIKE :search_" . $i;
        $query .= " OR stock_grade.name LIKE :search_" . $i;
        $query .= " OR sav.id LIKE :search_" . $i;
        $query .= " OR DATE_FORMAT(sav.date, '%d/%m/%Y') LIKE :search_" . $i;
        $query .= " OR sav.nom LIKE :search_" . $i;
        $query .= " OR sav.issue LIKE :search_" . $i;
        $query .= " OR sav.replacement_imei LIKE :search_" . $i;
        $query .= " OR sav.commentaire LIKE :search_" . $i;
        $query .= " OR sav.attente LIKE :search_" . $i;
        $query .= " OR sav.pieces LIKE :search_" . $i;
        $query .= " OR sav.frais LIKE :search_" . $i;
        $query .= " OR DATE_FORMAT(sav.date_envoi, '%d/%m/%Y') LIKE :search_" . $i;
        $query .= " OR sav.tracking LIKE :search_" . $i;
        $query .= " OR ( sav.termine = 1 AND 'termine'= :search_" . $i . " )";
        // $query .= "LIKE :search_" . $i;
        if ($i != (count($keywords) - 1)) {
            $query .= " ) AND ";
        } else {
            $query .= " ) ";
        }
        if (strtolower($keywords[$i]) == 'snowden' || strtolower($keywords[$i]) == 'termine') {
            $query_array['search_' . $i] = $keywords[$i];
        } else {
            $query_array['search_' . $i] = "%" . $keywords[$i] . "%";
        }
    }
    $query .= "ORDER BY sav.id DESC LIMIT $offset, $limit";
    $results = $this->bdd->prepare($query);
    $results->execute($query_array);
    return $results;
  • 1
    Пожалуйста, поделитесь структурами таблиц и некоторыми фиктивными данными, отражающими реальные данные, которые они публикуют как таблицы данных ascii, а не как изображения. Также опубликуйте ожидаемый результат как таблицу данных ascii.
  • 0
    Привет @RaymondNijland, я отредактировал свое сообщение с соответствующими полями. Вы можете увидеть sav.phone с stock.imei / sales.imei
Теги:
join
pdo
search-engine

1 ответ

0

Сначала я получаю все данные с полным внешним соединением, затем Sales.Model => Выберите все ID из Stock_Model.

SELECT sav.id, sav.phone, [...] FROM sav 
FULL OUTER JOIN sales ON (sav.phone = sales.imei)
WHERE sav.phone = sales.imei or sales.model in (select Id from stock_model)
  • 0
    Здравствуйте ! Вы не можете получить stock_model.id если у вас нет телефона. Нет поля sav.model
  • 0
    @AymDev Я отредактировал свой ответ, можешь проверить этот.
Показать ещё 2 комментария

Ещё вопросы

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