[英]Mysql SELECT multiple columns or one column and then display results with php. Which option better for performance
[英]mySQL: Return results from one column as multiple columns
第一次在這里問一個問題,如果最終被格式化得很差,那就道歉了。
我試圖從多個表中提取一些信息以構建報告。 所述表格來自Magento實例,以防萬一。
所以,我有四個我正在使用的表: customer_entity,customer_address_entity,customer_address_entity_text和customer_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.