如何在关系表中查询所有结果?

时间:2015-04-17 19:39:29

标签: mysql sql select foreign-key-relationship

在QUERY中,我从Book Table中选择了一个特定的产品数据。喜欢标题,作者,年份等。我想得到它的所有作者,但只显示 第一个

产品表:

produto
   idproduto
   sku
   titulo
   others not important

作者表:

autor
   id_autor
   nome_autor

关系表:

    autorxprod
        idautoria
        idprod (FK)
        idautor (FK)

如何显示与Book1相关的所有作者? 我应该在主QUERY中创建另一个QUERY吗?


用代码编辑。我已经在葡萄牙语中提出了一个原因

$produto = $_GET['sku']; 
$idproduto = $_GET['idprod'];

$query = "SELECT 

p.titulo AS titulo, p.imgprod AS imgprod, p.marca AS idmarca, p.sku AS sku,
p.prodcateg AS prodcateg, p.ano AS ano, p.titeng AS titeng,
p.codbarra AS codbarra, p.desc AS descricao, // product infos

c.idcategoria AS idcategoria, c.nomecateg AS nomecateg, // category infos
m.nome_marca AS nome_marca, // brand info

a.nome_autor AS nome_autor, // author info
a.id_autor AS idautor   // author id

FROM (produto p, autor a)

   LEFT JOIN categoria c // category join
   ON p.prodcateg = c.idcategoria

   LEFT JOIN marcas m // brand join
   ON p.marca = m.id_marca  

   LEFT JOIN autorxprod axp // relational table
   ON p.idproduto = axp.idprod
   AND a.id_autor = axp.idautor


   WHERE p.sku LIKE '$produto'";

   $result = $conn ->query ($query);


if (!$result) die ($conn->error);

$rows = $result->num_rows;  

    for ($j = 0; $j <$rows; ++$j)
    {
        $result -> data_seek($j);
        $row = $result->fetch_array (MYSQLI_ASSOC);?>

 -----------

 <?php echo $row['nome_autor']?>

3 个答案:

答案 0 :(得分:1)

感谢所有患者,因为我正在学习,我真的迷失了。 以下是我需要的完整结果,并且它按预期工作。 比以前简单得多。

此代码从相关产品中获取所有作者,并显示为作者1,作者2,作者3 ......

"SELECT     
            ....get stuff...

            a.id_autor AS idautor,
            GROUP_CONCAT(DISTINCT a.nome_autor ORDER BY a.nome_autor SEPARATOR ', ') AS autor_list


        FROM 

        produto p

        LEFT JOIN categoria c
        ON p.prodcateg = c.idcategoria  

        LEFT JOIN marcas m
        ON p.marca = m.id_marca     

        LEFT OUTER JOIN (autor a, autorxprod axp)
        ON axp.idautor = a.id_autor AND
        axp.idprod = '$produto'


        WHERE
        p.sku = '$produto'

答案 1 :(得分:0)

我不相信这是错的,但是你的sql在混合连接样式时有点奇怪。我可以建议一下:

SELECT 
  p.titulo AS titulo, p.imgprod AS imgprod, p.marca AS idmarca, p.sku AS sku,
  p.prodcateg AS prodcateg, p.ano AS ano, p.titeng AS titeng,
  p.codbarra AS codbarra, p.desc AS descricao, // product infos

  c.idcategoria AS idcategoria, c.nomecateg AS nomecateg, // category infos
  m.nome_marca AS nome_marca, // brand info

  a.nome_autor AS nome_autor, // author info
  a.id_autor AS idautor   // author id

FROM produto p
LEFT JOIN categoria c  ON p.prodcateg = c.idcategoria
LEFT JOIN marcas m  ON p.marca = m.id_marca  
LEFT JOIN autorxprod axp ON p.idproduto = axp.idprod
JOIN autor a ON a.id_autor = axp.idautor
-- above is what your code did, you could also use a left join like this and you might have null authors
-- LEFT JOIN autor a ON a.id_autor = axp.idautor
WHERE p.sku LIKE '$produto'

答案 2 :(得分:0)

我可能会弄错,但在我看来,你想要运行两个单独的查询。获取与搜索匹配的Book的第二个查询和获取该书的所有作者的第二个查询。因为关系表是多对一的,所以如果您尝试连接表,则最终会得到一个多次列出相同书籍的结果集,每个作者一个。这就是你想要的吗?

如果我弄错了,你确实想要每本书有多个记录,这里是你需要的简化版连接查询。

SELECT 
 p.titulo AS titulo
 a.nome_autor
FROM 
 author a,
 produto p
 LEFT JOIN autorxprod axp
 ON  axp.idprod =p.idproduto 
WHERE 
 p.sku LIKE '$produto'
 AND  axp.idautor = a.id_autor