0

我有两张桌子

公司和company_meta

公司表有以下

------------------------
id | title | city
------------------------
1 | abc | nice city
2 | def | awesome city
------------------------

company_meta 有

------------------------------------------------
id | company_id | meta_key | meta_value
------------------------------------------------
1 | 1 | feature_parking | Yes
2 | 1 | feature_fireexit | Yes
3 | 2 | feature_parking | No
4 | 2 | feature_gym | Yes
------------------------------------------------

现在我想在 Laravel 中加入这两个表并以显示以下内容的方式打印它

Company 1 : nice city
Parking : Yes
Fire Exit : Yes
Gym : No (if not mentioned it must automatically consider as NO)

Company 2 : awesome city
Parking : No
Fire Exit : No
Gym : Yes

使用 Foreach 语句。

通过查看 Wordpress DB,我得到了使用元数据的这种类型的表关系的想法。也有人可以告诉我这种类型的关系方法叫什么,以便我会在谷歌上搜索更多关于相同的方法。

还有其他更好的创建数据库关系的方法吗?我的数据库将有大约100,000 条公司数据,每家公司都有 10-12 个特征。所以这将是一个非常大的数据库。

4

2 回答 2

1

这是一对多的关系。按照你描述的方式,它似乎没有什么不好。如果您事先不知道每家公司可能有多少元属性,这种设计是可以的。

您可能希望在第二个表的 *company_id* 列上添加索引,以便可以有效地合并两个表。不要担心您预期的数据库大小,它不是大量的记录(数据库旨在处理数百万条记录)。如果您打算根据是否有任何特定的功能集来过滤数据,您可能还想在 *meta_key* 上添加另一个索引(即,给我所有具有功能 A 和 B 但没有 C 的公司)

于 2013-07-07T17:22:01.907 回答
1

您也可以使用subquery下面提到的查询来执行此操作,如果未提及,它也必须自动考虑为 NO

SELECT  
q.company_id,q.company_name,
CASE WHEN q.parking IS NULL THEN 'No' ELSE q.parking END AS parking,
CASE WHEN q.fireexit IS NULL THEN 'No' ELSE q.fireexit END AS fireexit,
CASE WHEN q.gym IS NULL THEN 'No' ELSE q.gym END AS gym
 FROM (
SELECT cm.`company_id`,
(SELECT `title` FROM `company` WHERE id=cm.`company_id`) AS company_name,
(SELECT `meta_value` FROM `company_meta` WHERE company_id=cm.`company_id` AND meta_key ='feature_parking') AS parking,
(SELECT `meta_value` FROM `company_meta` WHERE company_id=cm.`company_id` AND meta_key ='feature_fireexit') AS fireexit,
(SELECT `meta_value` FROM `company_meta` WHERE company_id=cm.`company_id` AND meta_key ='feature_gym') AS gym 
 FROM `company_meta` cm GROUP BY cm.`company_id` ) q

现在在 wordpress 中定义$wpdb数据库交互的全局变量

global $wpdb;

$results= $wpdb->get_results("    SELECT  
    q.company_id,q.company_name,
    CASE WHEN q.parking IS NULL THEN 'No' ELSE q.parking END AS parking,
    CASE WHEN q.fireexit IS NULL THEN 'No' ELSE q.fireexit END AS fireexit,
    CASE WHEN q.gym IS NULL THEN 'No' ELSE q.gym END AS gym
     FROM (
    SELECT cm.`company_id`,
    (SELECT `title` FROM `company` WHERE id=cm.`company_id`) AS company_name,
    (SELECT `meta_value` FROM `company_meta` WHERE company_id=cm.`company_id` AND meta_key ='feature_parking') AS parking,
    (SELECT `meta_value` FROM `company_meta` WHERE company_id=cm.`company_id` AND meta_key ='feature_fireexit') AS fireexit,
    (SELECT `meta_value` FROM `company_meta` WHERE company_id=cm.`company_id` AND meta_key ='feature_gym') AS gym 
     FROM `company_meta` cm GROUP BY cm.`company_id` ) q");

foreach($results as $r){

echo "Company ".$r->company_id ." : ".$r->company_name;
echo "Parking : ".$r->parking;
echo "Fire Exit : ".$r->fireexit;
echo "Gym : ".$r->gym;
}

这是你的小提琴

我希望它适合你

于 2013-07-07T17:47:15.877 回答