【问题标题】:MySQL JOIN a table or another [duplicate]MySQL JOIN 一个表或另一个 [重复]
【发布时间】:2018-01-26 00:26:41
【问题描述】:

背景:
该数据库是关于手机的。我在TABLE sav(“售后服务”记录)中有一个搜索引擎,其中有一个字段phone,其中包含IMEI(其唯一ID)电话。
在某些情况下,该手机将重新进入我们的库存(从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 [...]

我需要更改第二行,但我不明白怎么做。我之前阅读的问题似乎回答了具体案例。

编辑:表结构和虚拟数据
我不会发布不相关的字段(太多)
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

编辑:完整的搜索引擎 [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;

【问题讨论】:

  • 请分享表结构和一些反映真实数据的虚拟数据,将这些数据发布为 ascii 数据表而不是图像。同时将预期输出发布为 ascii 数据表。
  • 嗨@RaymondNijland,我用相关字段编辑了我的帖子。你可以看到sav.phone匹配stock.imei/sales.imei

标签: php mysql join pdo search-engine


【解决方案1】:

首先,我使用完全外连接获取所有数据,然后是 Sales.Model => 从 Stock_Model 中选择所有 ID。

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)

【讨论】:

  • 您好!如果您没有电话,您将无法获得stock_model.id。没有sav.model 字段
  • @AymDev 我编辑了我的答案,你能检查一下吗?
  • 我遇到的问题与stock_model 表无关。我想在sales.imeistock.imei 上加入sav.phoneWHERE 子句必须像我放置的那样,它之前只有 JOINs。后面是搜索引擎的多重条件。
  • 我不介意 where 子句,因为你可以在后面添加任何表达式。我想帮你加入。
猜你喜欢
  • 2012-03-15
  • 1970-01-01
  • 1970-01-01
  • 2017-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多