为上述代码执行 JOIN SQL 方法

Posted

技术标签:

【中文标题】为上述代码执行 JOIN SQL 方法【英文标题】:Performing a JOIN SQL method for this mentioned code 【发布时间】:2013-07-07 14:58:05 【问题描述】:

我有两张桌子

公司和公司元数据

公司表有以下内容

------------------------
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 了解了使用元数据的这种类型的表关系。还有谁能告诉我这种类型的关系方法叫什么,以便我将谷歌更多关于相同的tuts。

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

【问题讨论】:

【参考方案1】:

您可以使用subquery 执行此操作,下面提到的查询也会处理您的这个问题如果未提及,它必须自动将其视为否

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;

HERE IS YOUR FIDDLE

我希望它适合你

【讨论】:

实际上我没有使用 wordpress。我正在研究 laravel php,但使用与 WP 相似的数据库关系结构。 我已经为你的场景提供了查询 SQL fiddle 对我有很大帮助。谢谢 我只能选择 1 个正确答案,但他的代码和解决方案是正确的。你的sql是正确的。很抱歉我不能选择你的。我赞成你的。两个答案都很有用【参考方案2】:

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

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

【讨论】:

没错,我也想过滤。我现在将关注 INDEX。还有一件事情。我将有一个表单字段说明带有单选按钮是/否的停车。单击提交按钮时,它应该将“feature_parking”传递给 meta_key,并将 YES 传递给 meta_value。如何同时传递两个值? 在你的 html 标签 id="meta_something" 上设置 id 属性,并将值设置为 truefalse,然后在您的 PHP (?) 中将其正确保存在您的数据库中。 如何设置 id 标签将“feature_parking”传递给 DB 中的 meta_key? True 或 False 可以使用复选框。这是通常的 Post 方法。但是我在询问 meta_key 如果输入停车字段,它应该在哪里获得“feature_parking”默认值,我将根据该字段运行 php 以从 SQL 中提取我需要的数据。 我明白了,然后添加一个隐藏字段(它是一个不同的标签),并将值设置为您想要的 meta_key。然后使用 php 读取它的值。另一种选择是将值“META_SOMETHING_TRUE”或“META_SOMETHING_FALSE”相加,然后在您的 PHP 上正确执行 谢谢,我会试试的。但我仍在尝试检查 Laravel 是否可以实现上述关系

以上是关于为上述代码执行 JOIN SQL 方法的主要内容,如果未能解决你的问题,请参考以下文章

场景应用:SQL的执行顺序是怎样的?

在 sql中 多行sql语句怎么执行,是从上往下 还是从下往上??????求解

Mysql基础(十二):sql语句执行步骤详解准备工作

join的简单总结

Java:join方法详解

mysql怎么一次执行多条SQL语句