【问题标题】:PHP MYSQL arrayPHP MYSQL 数组
【发布时间】:2012-02-14 12:18:17
【问题描述】:

我在 PHP 中运行以下代码以从数据库中生成电影的随机列表,但由于genere 的值是一个数组,它只是捕获数组的第一个值。

如何修改查询,以便我可以在逗号分隔行中获取所有genere 的值。

      $q = "SELECT *
            FROM
              title
              INNER JOIN title_genere ON (title.id = title_genere.id_title)
              INNER JOIN genere ON (title_genere.id_genere = genere.id)
            ORDER BY RAND()  
            LIMIT 8";

$result = mysql_query($q);
while ($row = mysql_fetch_array($result)) {

    $id = $row['id'];
    $title = $row['title'];
    $year = $row['year'];
    $poster = $row['poster'];
    $poster = str_replace("./", "lib/", $poster);
    $genere = $row['genere'];

    echo "<div id='a'>";
    echo "<div id='b'>".$title.'</div>';
    echo "<div id='c'>".$year.'</div>';
    echo "<div id='d'><a href='select.php?movieid=$id'><img src='$poster' alt='' border='1' align='center' width='214' height='314' /></a></div>";
    echo "<div id='e'>".$genere.'</div>';
    echo "</div>";
    //var_dump($genere);
}

【问题讨论】:

标签: php mysql arrays inner-join


【解决方案1】:

试试这个:

$q = "SELECT 
          *, 
          GROUP_CONCAT(CAST(title_genere AS BINARY) SEPARATOR ',') AS generes
      FROM
          title
          INNER JOIN title_genere ON (title.id = title_genere.id_title)
          INNER JOIN genere ON (title_genere.id_genere = genere.id)
      ORDER BY RAND()  
      GROUP BY title.id
      LIMIT 8";

这应该选择一个逗号分隔的generes列表到键generes中。有关更多信息,请参阅http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_group-concat 的手册

【讨论】:

  • 他为什么要使用CAST … AS BINARY
  • @kuboslav 我从我的一个项目中获取了代码,很久以前我在互联网上找到了它。 GROUP_CONCAT(title_genere SEPARATOR ',') AS generes 会正确吗?
  • 我想这会更好——CAST 是不必要的。
  • 如果我不使用“ORDER BY RAND()”,这可以正常工作,但是一旦我在 SQL 查询中添加这一行,它就会给我错误“警告:mysql_fetch_array() 期望参数 1 是资源,布尔值“
【解决方案2】:

不要使用 GROUP_CONCAT/GROUP BY,它会导致开销。

首先,将您的 8 个随机标题(仅来自 titles 表)选择到一个由标题 ID 索引的关联数组中。我们将其命名为 $idx。

接下来,准备 id 列表,比如 $ids 变量。

然后,运行查询

SELECT 
 title_genere.id_title
 , genre.genre
FROM
 title_genre
 INNER JOIN genre ON title_genere.id_genere = genere.id
WHERE 
 title_genere.id_title IN ($ids)
ORDER BY
 genre

并在$idx 的列表中收获genre 值:

$idx[$row['id_title']]['genres'][] = $row['genre']

最后,从 $idx 生成 HTML。

【讨论】:

    【解决方案3】:

    整理好了。我使用下面的代码来生成我想要的。谢谢大家的帮助

    SELECT 
          title.id,
          title.title,
          GROUP_CONCAT(genere SEPARATOR ' | ') AS genere,
          title.`year`,
          title.poster
        FROM
          title
          INNER JOIN title_genere ON (title.id = title_genere.id_title)
          INNER JOIN genere ON (title_genere.id_genere = genere.id)
        GROUP BY
          title.id,
          title.title,
          title.`year`,
          title.poster
        ORDER BY
          RAND()
        LIMIT 8
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-27
      • 2014-05-10
      • 2018-03-03
      • 2015-10-11
      • 2016-10-07
      相关资源
      最近更新 更多