SQl查询选择关系数据

时间:2011-11-03 13:02:22

标签: php sql zend-framework

我正在尝试编写选择所有products和可用features的SQL。

我的数据库如下:

CREATE TABLE IF NOT EXISTS `products` (
  `product_id` int(11) NOT NULL AUTO_INCREMENT,
  `product_name` varchar(255) NOT NULL,
  `product_description` varchar(255) NOT NULL,
  `product_weight` varchar(255) NOT NULL,
  `product_price` decimal(11,2) NOT NULL,
  `product_image` varchar(255) NOT NULL,
  PRIMARY KEY (`product_id`)
);

CREATE TABLE IF NOT EXISTS `features` (
  `feature_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `feature_uri` varchar(255) NOT NULL,
  `feature_name` varchar(100) NOT NULL,
  `feature_title` varchar(150) DEFAULT NULL,
  `feature_body` text,
  `feature_body_short` varchar(255) DEFAULT NULL,
  `feature_image` varchar(255) DEFAULT NULL,
  `parent_id` int(11) unsigned NOT NULL,
  PRIMARY KEY (`feature_id`),
  UNIQUE KEY `feature_uri_UNIQUE` (`feature_uri`),
  KEY `parentFK` (`feature_id`),
  FULLTEXT KEY `feature_name_FT` (`feature_name`),
  FULLTEXT KEY `feature_body_FT` (`feature_body`)
);

CREATE TABLE IF NOT EXISTS `feature_products` (
  `feature_product_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `feature_product_order` smallint(6) DEFAULT NULL,
  `feature_product_standard` tinyint(1) NOT NULL,
  `feature_id` int(11) unsigned NOT NULL,
  `product_id` int(11) unsigned NOT NULL,
  PRIMARY KEY (`feature_product_id`),
  KEY `productFK` (`product_id`),
  KEY `featureFK` (`feature_id`)
);

我希望能够在一个循环中执行此操作,例如:

{foreach}
<tr>
    <td>{name}</td>
    <td>{weight}</td>
    <td>{if product_id == 1}yes{/if}</td>
    <td>{if product_id == 2}yes{/if}</td>
etc
<tr>
{/foreach}

我正在使用Zend,如果这可以使用的话。

尝试实现此HTML: example

更新:

非建议的答案正在发挥作用,相反我设法破解它的工作方式如下:

SELECT
  p.*,
  (
    SELECT
      GROUP_CONCAT(f.feature_id SEPARATOR ', ')
    FROM feature_products fp
      LEFT JOIN features f ON f.features_id = fp.feature_id
    WHERE fp.product_id = p.product_id
    LIMIT 1
  ) as features
FROM product p

虽然上面代码的问题是它没有返回'feature_product_standard'

2 个答案:

答案 0 :(得分:1)

我假设你有MySQL,关于Zend的dunno,但这应该让你开始。

SELECT 
  p.product_name
  , p.product_description
  , p.product_weight
  , p.product_price
  , p.product_image
  , GROUP_CONCAT(f.feature_id ORDER BY f.feature_id) as feature_ids
  , GROUP_CONCAT(f.feature_name ORDER BY f.feature_id) as feature_names
FROM products p
LEFT JOIN feature_products fp ON (fp.product_id = p.product_id)
LEFT JOIN features f ON (f.feature_id = fp.feature_id)
GROUP BY p.product_id

答案 1 :(得分:0)

我知道的代码不是很好,但我希望它有所帮助。 这是使用Johan的SQL代码。

我没有测试过这个。

$connection = odbc_connect("Connection info here");

$query = "SELECT 
      p.product_name
   , p.product_description
  , p.product_weight
  , p.product_price
  , p.product_image
  , GROUP_CONCAT(f.feature_id ORDER BY f.feature_id) as feature_ids
  , GROUP_CONCAT(f.feature_name ORDER BY f.feature_id) as feature_names
FROM products p
LEFT JOIN feature_products fp ON (fp.product_id = p.product_id)
LEFT JOIN features f ON (f.feature_id = fp.feature_id)";

$result = odbc_exec($connection, $query);

while ($data[] = odbc_fetch_array($result));

odbc_close($connection);

if ($data[0]["product_name"]) {
echo "<table><tr>";

foreach (array_keys($data[0]) as $a) { $message .= "<th>".$a."</th>"; }
foreach ($data as $d) {
if ($d["product_name"]) {
if ($d) {
echo "</tr><tr>\n";
foreach ($d as $s) {

echo "<td>".$s."</td>";
}
}
}
}
}