簡體   English   中英

mySQL:將一列作為多列返回結果

[英]mySQL: Return results from one column as multiple columns

第一次在這里問一個問題,如果最終被格式化得很差,那就道歉了。

我試圖從多個表中提取一些信息以構建報告。 所述表格來自Magento實例,以防萬一。

所以,我有四個我正在使用的表: customer_entity,customer_address_entity,customer_address_entity_textcustomer_address_var_char

customer_entity中 ,我需要獲得三個字段:entity_id,email和group_id

customer_address_entity中 ,我需要獲取parent_id(等於上面的entity_id)和entity_id(與上面的不同)。

customer_address_entity_text中 ,我需要entity_id,attribute_id和value。

customer_address_entity_varchar中 ,我需要value,entity_id和attribute_id。

我的問題主要在於最后一張表。 我需要獲得六個屬性id的值,但我希望將值作為多個列(名字,姓氏,電子郵件等),而不是僅返回值。

這是我目前的代碼:

SELECT
customer_entity.entity_id as "Customer ID", email, customer_address_entity_text.value as "Street Address", customer_address_entity_varchar.value
FROM
customer_entity, customer_address_entity, customer_address_entity_text, customer_address_entity_varchar
WHERE
customer_entity.group_id="2"
AND
customer_entity.entity_id = customer_address_entity.parent_id
AND
customer_address_entity.entity_id = customer_address_entity_text.entity_id
AND
customer_address_entity_text.attribute_id="24"
AND
customer_address_entity.entity_id = customer_address_entity_varchar.entity_id
AND
customer_address_entity_varchar.attribute_id in (19,21,25,26,27)

這將返回格式如下的結果:

當前

我想要的是:

期望

是的,列順序不是最好的,但是在我按照需要格式化列之后我會處理它。 我嘗試了幾個子串查詢(其中一個最終崩潰服務器; oops)和使用EXISTS。 是的,我的代碼也很可怕; 我計划以我正在尋找的格式獲取我正在尋找的數據后清理它。

謝謝!

編輯:是否有人想要我最終部署的代碼的副本(帽子提示到Bernd):

SELECT
e.entity_id as "Customer ID", e.email, t.value AS "Street Address",
GROUP_CONCAT(IF(v.attribute_id = 19,v.value,NULL)) AS "First Name",
GROUP_CONCAT(IF(v.attribute_id = 21,v.value,NULL)) AS "Last Name",
GROUP_CONCAT(IF(v.attribute_id = 25,v.value,NULL)) AS "City",
GROUP_CONCAT(IF(v.attribute_id = 27,v.value,NULL)) AS "Region/State",
GROUP_CONCAT(IF(v.attribute_id = 26,v.value,NULL)) AS "Country"
FROM customer_entity e 
LEFT JOIN customer_address_entity a ON a.parent_id = e.entity_id
LEFT JOIN customer_address_entity_varchar v ON v.entity_id = a.entity_id
LEFT JOIN customer_address_entity_text t on t.entity_id = a.entity_id
WHERE e.group_id = 2
AND t.attribute_id = 24
GROUP BY v.entity_id

沒有必要多次加入表格。 您可以對結果進行分組並獲取值。 這是一個樣本

兩張桌子

MariaDB [tmp]> select *from names;
+----+-------+----------------+
| id | name  | email          |
+----+-------+----------------+
|  1 | Bernd | bernd@bernd.de |
|  2 | David | david@david.de |
+----+-------+----------------+
2 rows in set (0.00 sec)

MariaDB [tmp]> select * from customer_address_entity;
+-----------+--------------+------------------+
| entity_id | attribute_id | value            |
+-----------+--------------+------------------+
|         1 |            1 | Duesseldorf      |
|         1 |            2 | 40211            |
|         1 |            3 | berlinerplatz 55 |
|         1 |            4 | 0211 / 1234567   |
|         2 |            1 | Bremen           |
|         2 |            2 | 21334            |
|         2 |            3 | Aachenerstr. 99  |
|         2 |            4 | 0432 / 7890111   |
+-----------+--------------+------------------+
8 rows in set (0.00 sec)

加入表格

MariaDB [tmp]> SELECT
    ->   n.*,a.*
    -> FROM `names` n
    -> LEFT JOIN customer_address_entity a ON a.entity_id = n.id;
+----+-------+----------------+-----------+--------------+------------------+
| id | name  | email          | entity_id | attribute_id | value            |
+----+-------+----------------+-----------+--------------+------------------+
|  1 | Bernd | bernd@bernd.de |         1 |            1 | Duesseldorf      |
|  1 | Bernd | bernd@bernd.de |         1 |            2 | 40211            |
|  1 | Bernd | bernd@bernd.de |         1 |            3 | berlinerplatz 55 |
|  1 | Bernd | bernd@bernd.de |         1 |            4 | 0211 / 1234567   |
|  2 | David | david@david.de |         2 |            1 | Bremen           |
|  2 | David | david@david.de |         2 |            2 | 21334            |
|  2 | David | david@david.de |         2 |            3 | Aachenerstr. 99  |
|  2 | David | david@david.de |         2 |            4 | 0432 / 7890111   |
+----+-------+----------------+-----------+--------------+------------------+
8 rows in set (0.00 sec)

分組並獲取字段

MariaDB [tmp]> SELECT
    ->   n.name, n.email,
    ->   GROUP_CONCAT( IF ( a.attribute_id = 1 , a.value,NULL)) AS city,
    ->   GROUP_CONCAT( IF ( a.attribute_id = 2 , a.value,NULL)) AS plz,
    ->   GROUP_CONCAT( IF ( a.attribute_id = 3 , a.value,NULL)) AS street,
    ->   GROUP_CONCAT( IF ( a.attribute_id = 4 , a.value,NULL)) AS phone
    -> FROM `names` n
    -> LEFT JOIN customer_address_entity a ON a.entity_id = n.id
    -> GROUP BY a.entity_id;
+-------+----------------+-------------+-------+------------------+----------------+
| name  | email          | city        | plz   | street           | phone          |
+-------+----------------+-------------+-------+------------------+----------------+
| Bernd | bernd@bernd.de | Duesseldorf | 40211 | berlinerplatz 55 | 0211 / 1234567 |
| David | david@david.de | Bremen      | 21334 | Aachenerstr. 99  | 0432 / 7890111 |
+-------+----------------+-------------+-------+------------------+----------------+
2 rows in set (0.00 sec)

MariaDB [tmp]>

MySQL支持連接表本身,因此您需要多次連接eav表並提取“value”字段:(示例)

   SELECT customer_entity.entity_id as "Customer ID"
   customer_address_street.value as "Street" 
   LEFT JOIN customer_address_entity_varchar as customer_address_street
   ON customer_address_street.entity_id = customer_entity.entity_id
   WHERE customer_address_street.attribute_id = 19;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM