4

以下のように3つのフィールドを持つ「カテゴリ」という名前のこのテーブルがあります

cat     | order | id
--------|-------|----
News    |  3    | 23
Hi-Tech |  2    | 15
Biz     |  5    | 8
Health  |  1    | 3

また、以下のような「リンク」という名前の別のテーブルがあります

link    | order | cat-id
--------|-------|-------
link1   |  2    | 23
link2   |  8    | 15
link3   |  5    | 8
link4   |  6    | 15
link5   |  2    | 15
link6   |  4    | 23
link7   |  1    | 3
link8   |  1    | 8

私が達成したいのは、カテゴリを並べ替え、各カテゴリの下でそのカテゴリのリンクを並べ替えることですcat -id / id以下のように:

健康
リンク7

ハイテク
link5
link4
link2

ニュース
link1
link6

Biz
link8
link3

カテゴリを並べ替えて表示することに成功しましたが、後で失っています。

私の目的はこれをページに表示することなので、PHP と mySQL を使用する必要があると思います。

4

10 に答える 10

16

クエリは次のとおりです。

SELECT c.cat, l.link, c.id
FROM links l INNER JOIN categories c
ON l.cat-id = c.id
ORDER BY c.`order`, l.`order`

そしてここでそれは働いています。

ページに表示するには、次のようになります。

mysql_connect(<host>, <username>, <password>);

$q = mysql_query("<query from above>");
$last_cat = 0;
while($row = mysql_fetch_assoc($q)) {
    if($row['id'] != $last_cat) {
        print '<h3>' . $row['cat'] . '</h3>';
        $last_cat = $row['id'];
    }
    print $row['link'] . '<br>';
}
于 2012-04-29T00:31:30.330 に答える
5

私はこれを自分の頭で書いたのでテストしませんでしたが、次のようになります。

$q = mysql_query("select * from categories c 
      left join links l 
      on l.cat-id=c.id 
      order by c.order,l.order");

$last_cat = -1;

while($row=mysql_fetch_assoc($q)){
    if($last_cat!=$row["cat"]){
        echo "<br><b>".$row["cat"]."</b><br>";
        $last_cat=$row["cat"];
    }
    echo $row["link"]."<br>";
}
于 2012-04-29T00:46:37.757 に答える
2
<?php
// This query gets all the needed data with one shot. No need to do multiple
// queries. You can run this query in phpMyAdmin to see the result.
$query = mysql_query("
    SELECT links.link as link, categories.cat as cat FROM links
    LEFT JOIN categories ON categories.id = links.cat_id
    ORDER BY categories.order, links.order ASC");

// With this we are getting all links with correct order to an array.
$categories = array();
while ($row = mysql_fetch_array($query)) {
    $categories[$row['cat']][] = $row['link'];
}

// To see how we stored the links in the array uncomment the below line
// var_dump($categories);

// To print out the data:
foreach ($categories as $category => $links) {
    echo "<strong>".$category."</strong><br />\n";

    // implode is a built-in function that makes a string from an array.
    // You can put something between the array elements with the first parameter.
    // If you want to make some changes or print the links, use a foreach loop.
    echo implode("<br />\n", $links)."<br /><br />\n";
}
?>

これにより、必要なリンクが正確に書き込まれるはずです。

于 2012-05-05T13:40:26.230 に答える
2

これは、例で説明したとおりに正確に印刷されます。

<?php
$categories = mysql_query("SELECT * FROM categories order by 'order'");
$links = mysql_query("SELECT * FROM links order by 'order'"); 
?>

<?php foreach ($categories as $key => $category): ?>
 <b><?php echo $category['cat'];?>"</b>
    <?php foreach ($links as $key => $link): ?>
      <?php if($category['id'] === $link['cat-id']): ?>
         <?php echo $link['link'];?>
      <?php endif;?>
    <?php endforeach;?>
   <br />
<?php endforeach;?>
于 2012-05-05T11:37:11.440 に答える
1

あなたのクエリに従って、最適化を考える必要がある場合は、いくつかのケースを検討します

ケース 1: あなたが言及したように、60 (リンク) * 5 (カテゴリ) になると、これらは mysql 側自体から処理するのが非常に簡単です。SQL テクニック自体をうまく利用して、その利点を得ることができます。

常に PHP 処理 + SQL を混在させることができます。PHP の処理速度は mysql よりも高速です。そう、それをつかむ。

あなたのクエリはSQlだけでも解決でき、paoloが言及したクエリは簡単に使用できます。

ケース 2: テーブル参加テーブルの一方または両方のレコード数が多すぎる状況があります。それらの間に結合がある場合、多数の組み合わせ、つまり結合サイズが発生します。例: リンク (100000) * カテゴリ (10) = 100 万 これらの場合、結合を避けることができます。

インデックスを活用できます。インデックスは、特定の列の値を持つ行をすばやく見つけるために使用されます。インデックスがない場合、MySQL は最初の行から始めて、テーブル全体を読み取って関連する行を見つける必要があります。

フラット ファイル、つまり、結合の概念を使用しない MongoDB のようなスキーマ フリー データベースのような手法がありますが、巨大なサイトで実行することを計画している場合 (巨大なため、ホストするために多くのサーバーが必要になることを意味します)

MySQl は適切にスケーリングされ、huuuuuuuuge 環境にいるときは、MySQl から何かを考える必要があります。

ここでは、結合と依存クエリを使用せずにクエリを解決しました。私は結果をフェッチし、より高速な配列マッピング手法のみを使用しました。

 $query = mysql_query("SELECT * FROM category order by `order` asc");
 while($row = mysql_fetch_assoc($query) ) {
     $categories[$row['id']]['cat']  = $row['cat'];
     $categories[$row['id']]['order'] = $row['order'];

 } 

 $query = mysql_query("SELECT * FROM links ORDER BY `order` ASC ");
 $count =0; 
 while($row = mysql_fetch_assoc($query) ) {
     $links[$row['cat-id']][$count]['link']  = $row['link'];
     $links[$row['cat-id']][$count]['order']  = $row['order'];
     $links[$row['cat-id']][$count]['cat-id']  = $row['cat-id'];
     $count++; 
 } 

foreach ($categories as $id=$value) {
     foreach ($links[$id] as $link_info) {

         if ($last_cat != $link_info['cat-id'])
             print '<h3' . $categories[$link_info['cat-id']]['cat'] . '</h3';

         print $link_info['link'] . '<br';
         $last_cat = $link_info['cat-id'];
     } }
于 2012-05-02T21:12:01.870 に答える
1
ORDER BY categories.order ASC, links.order ASC
于 2012-04-29T00:32:36.653 に答える
1
select cat, link
from categories, links
where link.cat-id = categories.id
order by cat asc, link asc;
于 2012-04-29T00:36:09.647 に答える
0

多くの人が言うように、最初のクエリは次のとおりです。

SELECT c.cat,c.order as catorder,c.id,l.* FROM categories as c 
INNER JOIN links as l ON (c.id = l.id-cat )
ORDER BY c.order, l.order 

したがって、結果は次のように並べられます。

cat     | catorder | id  |  link   | order | cat-id
--------|----------|-----|---------|-------|-------
Health  |  1       | 3   |  link7  |  1    |  3
Hi-Tech |  2       | 15  |  link5  |  2    |  15
Hi-Tech |  2       | 15  |  link4  |  6    |  15
Hi-Tech |  2       | 15  |  link2  |  8    |  15
News    |  3       | 23  |  link1  |  2    |  23
News    |  3       | 23  |  link6  |  4    |  23
Biz     |  5       | 8   |  link8  |  1    |  8
Biz     |  5       | 8   |  link3  |  1    |  8  

だから..「カットコントロール」を作る必要があります

$max = sizeof($arrayOfResults)
$i = 0;
while ($i < $max) {
    $current = $arrayOfResults[$i]["id"];
    print_r($arrayOfResults[$current]["cat"]);
    while ($i < $max && $arrayOfResults[$i]["id"] == $current) {
        print_r($arrayOfResults[$current]["link"]);
        $i++;
    }
}

このコードをコピーして貼り付けると、検索結果が得られます。

説明が必要な場合は、私に尋ねてください。

于 2012-05-03T15:08:43.307 に答える
-1

コードはこのようなものかもしれません。

<?php
$result_catg = mysql_query("select * from categories order by order asc");
?>
<ul>
<?php
while($row_catg = mysql_fetch_array($result_catg))
{
$catg_id = $row_catg['id'];
$result_link = mysql_query("select * from links where cat_id = '$catg_id' order by order asc");
while($row_link = mysql_fetch_array($result_link))
{
?>
<li class="down"><?php echo $row_link['link']; ?></li>
<?php
}
}
?>
</ul>

li downの css プロパティで "float:none" を使用するだけです

お役に立てれば。

于 2012-04-29T14:23:09.390 に答える
-1

これにより、必要な結果が得られます。

$ds = mysql_query("select cat, id from categories order by  'order' asc");
while($rs = mysql_fetch_row($ds))
{
    echo"<b>".$rs[0]."<b><br/>";
    $dsLinks = mysql_query("select link from links where cat_id = '".$rs[1]."' order by 'order' asc");
    while($rsLink = mysql_fetch_row($ds))
    {
        echo"<b>".$rsLink [0]."<b><br/>";
    }
    echo"<br/>";
}
于 2012-05-03T05:57:26.377 に答える