{"id":2553,"date":"2025-03-24T08:47:03","date_gmt":"2025-03-23T23:47:03","guid":{"rendered":"https:\/\/dexall.co.jp\/articles\/?p=2553"},"modified":"2025-03-24T08:47:33","modified_gmt":"2025-03-23T23:47:33","slug":"%e3%80%90%e4%bf%9d%e5%ad%98%e7%89%88%e3%80%91laravel%e3%81%aedistinct%e3%83%a1%e3%82%bd%e3%83%83%e3%83%89%e5%ae%8c%e5%85%a8%e8%a7%a3%e8%aa%ac%ef%bc%81%e5%ae%9f%e8%a3%85%e4%be%8b%e3%81%a8%e3%83%91","status":"publish","type":"post","link":"https:\/\/dexall.co.jp\/articles\/?p=2553","title":{"rendered":"\u3010\u4fdd\u5b58\u7248\u3011Laravel\u306eDistinct\u30e1\u30bd\u30c3\u30c9\u5b8c\u5168\u89e3\u8aac\uff01\u5b9f\u88c5\u4f8b\u3068\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u6700\u9069\u53167\u9078"},"content":{"rendered":"\n<div class=\"toc\"><br \/>\n<b>Warning<\/b>:  Undefined array key \"is_admin\" in <b>\/home\/xs392991\/dexall.co.jp\/public_html\/articles\/wp-content\/themes\/sango-theme\/library\/gutenberg\/dist\/classes\/Toc.php<\/b> on line <b>116<\/b><br \/>\n<br \/>\n<b>Warning<\/b>:  Undefined array key \"is_category_top\" in <b>\/home\/xs392991\/dexall.co.jp\/public_html\/articles\/wp-content\/themes\/sango-theme\/library\/gutenberg\/dist\/classes\/Toc.php<\/b> on line <b>121<\/b><br \/>\n<br \/>\n<b>Warning<\/b>:  Undefined array key \"is_top\" in <b>\/home\/xs392991\/dexall.co.jp\/public_html\/articles\/wp-content\/themes\/sango-theme\/library\/gutenberg\/dist\/classes\/Toc.php<\/b> on line <b>128<\/b><br \/>\n    <div id=\"toc_container\" class=\"sgb-toc--bullets js-smooth-scroll\" data-dialog-title=\"\u76ee\u6b21\">\n      <p class=\"toc_title\">\u76ee\u6b21 <\/p>\n      <ul class=\"toc_list\">  <li class=\"first\">    <a href=\"#i-0\">Laravel\u306edistinct\u30e1\u30bd\u30c3\u30c9\u3068\u306f<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-1\">distinct\u30e1\u30bd\u30c3\u30c9\u306e\u57fa\u672c\u7684\u306a\u4ed5\u7d44\u307f<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-2\">SQL\u306eDISTINCT\u3068\u306e\u9055\u3044\u3092\u7406\u89e3\u3059\u308b<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-3\">distinct\u30e1\u30bd\u30c3\u30c9\u306e\u57fa\u672c\u7684\u306a\u4f7f\u3044\u65b9<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-4\">\u30b7\u30f3\u30d7\u30eb\u306a\u30ab\u30e9\u30e0\u3067\u306edistinct\u51e6\u7406<\/a>      <\/li>      <li>        <a href=\"#i-5\">\u8907\u6570\u30ab\u30e9\u30e0\u3092\u7d44\u307f\u5408\u308f\u305b\u305fdistinct\u51e6\u7406<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-6\">\u30ea\u30ec\u30fc\u30b7\u30e7\u30f3\u5185\u3067\u306edistinct\u6d3b\u7528\u6cd5<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-7\">\u5b9f\u8df5\u7684\u306adistinct\u306e\u6d3b\u7528\u30b7\u30fc\u30f3<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-8\">\u91cd\u8907\u30c7\u30fc\u30bf\u306e\u52b9\u7387\u7684\u306a\u9664\u5916\u65b9\u6cd5<\/a>      <\/li>      <li>        <a href=\"#i-9\">\u96c6\u8a08\u51e6\u7406\u3067\u306e\u6d3b\u7528\u30c6\u30af\u30cb\u30c3\u30af<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-10\">\u5927\u898f\u6a21\u30c7\u30fc\u30bf\u30bb\u30c3\u30c8\u3067\u306e\u4f7f\u7528\u65b9\u6cd5<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-11\">distinct\u30e1\u30bd\u30c3\u30c9\u306e\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u6700\u9069\u5316<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-12\">\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u8a2d\u8a08\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9<\/a>      <\/li>      <li>        <a href=\"#i-13\">\u30e1\u30e2\u30ea\u4f7f\u7528\u91cf\u3092\u6291\u3048\u308b\u30c6\u30af\u30cb\u30c3\u30af<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-14\">N+1\u554f\u984c\u3092\u56de\u907f\u3059\u308b\u5b9f\u88c5\u65b9\u6cd5<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-15\">distinct\u30e1\u30bd\u30c3\u30c9\u306e\u5fdc\u7528\u30c6\u30af\u30cb\u30c3\u30af<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-16\">\u30b5\u30d6\u30af\u30a8\u30ea\u3067\u306edistinct\u6d3b\u7528\u6cd5<\/a>      <\/li>      <li>        <a href=\"#i-17\">\u30bd\u30fc\u30c8\u51e6\u7406\u3068\u7d44\u307f\u5408\u308f\u305b\u305f\u5b9f\u88c5\u4f8b<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-18\">\u30ad\u30e3\u30c3\u30b7\u30e5\u3092\u6d3b\u7528\u3057\u305f\u9ad8\u901f\u5316\u624b\u6cd5<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-19\">\u3088\u304f\u3042\u308b\u30a8\u30e9\u30fc\u3068\u89e3\u6c7a\u65b9\u6cd5<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-20\">\u5b9f\u884c\u6642\u30a8\u30e9\u30fc\u306e\u539f\u56e0\u3068\u5bfe\u51e6\u6cd5<\/a>      <\/li>      <li>        <a href=\"#i-21\">\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u4f4e\u4e0b\u6642\u306e\u30c7\u30d0\u30c3\u30b0\u65b9\u6cd5<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-22\">SQL\u30af\u30a8\u30ea\u6700\u9069\u5316\u306e\u305f\u3081\u306e\u30c8\u30e9\u30d6\u30eb\u30b7\u30e5\u30fc\u30c6\u30a3\u30f3\u30b0<\/a>      <\/li>    <\/ul>  <\/li>  <li class=\"last\">    <a href=\"#i-23\">\u5b9f\u88c5\u4f8b\u3067\u5b66\u3076distinct\u306e\u6d3b\u7528<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-24\">\u30e6\u30fc\u30b6\u30fc\u4e00\u89a7\u3067\u306e\u91cd\u8907\u9664\u5916\u5b9f\u88c5<\/a>      <\/li>      <li>        <a href=\"#i-25\">\u5546\u54c1\u30ab\u30c6\u30b4\u30ea\u3067\u306e\u6d3b\u7528\u4e8b\u4f8b<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-26\">\u30a2\u30af\u30bb\u30b9\u30ed\u30b0\u96c6\u8a08\u3067\u306e\u5b9f\u8df5\u4f8b<\/a>      <\/li>    <\/ul>  <\/li><\/ul>\n      <a href=\"#\" class=\"sgb-toc-button js-toc-button\" rel=\"nofollow\" data-open-dialog=\"true\"><i class=\"fa fa-list\"><\/i><span class=\"sgb-toc-button__text\">\u76ee\u6b21\u3078<\/span><\/a>\n    <\/div><\/div><h2 class=\"wp-block-heading\" id=\"i-0\">Laravel\u306edistinct\u30e1\u30bd\u30c3\u30c9\u3068\u306f<\/h2>\n\n\n\n<p>Laravel\u306eDistinct\u30e1\u30bd\u30c3\u30c9\u306f\u3001Eloquent\u30af\u30a8\u30ea\u30d3\u30eb\u30c0\u30fc\u3067\u63d0\u4f9b\u3055\u308c\u308b\u5f37\u529b\u306a\u6a5f\u80fd\u306e1\u3064\u3067\u3059\u3002\u3053\u306e\u30e1\u30bd\u30c3\u30c9\u3092\u4f7f\u7528\u3059\u308b\u3053\u3068\u3067\u3001\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u30af\u30a8\u30ea\u306e\u7d50\u679c\u304b\u3089\u91cd\u8907\u3057\u305f\u30ec\u30b3\u30fc\u30c9\u3092\u9664\u5916\u3057\u3001\u30e6\u30cb\u30fc\u30af\u306a\u7d50\u679c\u30bb\u30c3\u30c8\u3092\u53d6\u5f97\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-1\">distinct\u30e1\u30bd\u30c3\u30c9\u306e\u57fa\u672c\u7684\u306a\u4ed5\u7d44\u307f<\/h3>\n\n\n\n<p>distinct\u30e1\u30bd\u30c3\u30c9\u306f\u3001SQL\u306eDISTINCT\u53e5\u3092\u30e9\u30c3\u30d7\u3057\u305f\u6a5f\u80fd\u3068\u3057\u3066\u5b9f\u88c5\u3055\u308c\u3066\u3044\u307e\u3059\u3002\u57fa\u672c\u7684\u306a\u52d5\u4f5c\u306e\u4ed5\u7d44\u307f\u306f\u4ee5\u4e0b\u306e\u901a\u308a\u3067\u3059\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u30af\u30a8\u30ea\u30d3\u30eb\u30c0\u30fc\u30ec\u30d9\u30eb\u3067\u306e\u51e6\u7406<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30af\u30a8\u30ea\u30d3\u30eb\u30c0\u30fc\u304cSQL\u30af\u30a8\u30ea\u3092\u69cb\u7bc9\u3059\u308b\u969b\u306b\u3001DISTINCT\u53e5\u3092\u9069\u5207\u306a\u4f4d\u7f6e\u306b\u633f\u5165<\/li>\n\n\n\n<li>\u6307\u5b9a\u3055\u308c\u305f\u30ab\u30e9\u30e0\u306e\u307f\u3092\u5bfe\u8c61\u3068\u3057\u305f\u91cd\u8907\u9664\u5916\u51e6\u7406\u3092\u5b9f\u884c<\/li>\n\n\n\n<li>\u30af\u30a8\u30ea\u306e\u5b9f\u884c\u8a08\u753b\u3092\u6700\u9069\u5316<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u30ec\u30d9\u30eb\u3067\u306e\u51e6\u7406<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u6307\u5b9a\u3055\u308c\u305f\u30ab\u30e9\u30e0\u306e\u5024\u3092\u57fa\u6e96\u306b\u4e00\u610f\u6027\u30c1\u30a7\u30c3\u30af\u3092\u5b9f\u884c<\/li>\n\n\n\n<li>\u91cd\u8907\u30c7\u30fc\u30bf\u306e\u6392\u9664\u51e6\u7406\u3092\u5b9f\u884c<\/li>\n\n\n\n<li>\u7d50\u679c\u30bb\u30c3\u30c8\u306e\u751f\u6210<\/li>\n<\/ul>\n\n\n\n<p>\u57fa\u672c\u7684\u306a\u5b9f\u88c5\u4f8b\uff1a<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ \u57fa\u672c\u7684\u306a\u4f7f\u7528\u65b9\u6cd5\n$uniqueUsers = DB::table('users')\n    -&gt;distinct()\n    -&gt;get(['email']);\n\n\/\/ \u7279\u5b9a\u306e\u30ab\u30e9\u30e0\u306b\u5bfe\u3059\u308b\u4f7f\u7528\n$uniqueCategories = DB::table('products')\n    -&gt;select('category_id')\n    -&gt;distinct()\n    -&gt;get();\n\n\/\/ \u8907\u6570\u30ab\u30e9\u30e0\u306e\u7d44\u307f\u5408\u308f\u305b\n$uniqueCombinations = DB::table('orders')\n    -&gt;select('user_id', 'product_id')\n    -&gt;distinct()\n    -&gt;get();<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-2\">SQL\u306eDISTINCT\u3068\u306e\u9055\u3044\u3092\u7406\u89e3\u3059\u308b<\/h3>\n\n\n\n<p>Laravel\u306edistinct\u30e1\u30bd\u30c3\u30c9\u3068SQL\u306eDISTINCT\u53e5\u306b\u306f\u3001\u3044\u304f\u3064\u304b\u306e\u91cd\u8981\u306a\u9055\u3044\u304c\u3042\u308a\u307e\u3059\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u4f7f\u7528\u6027\u306e\u9055\u3044 \u6a5f\u80fd Laravel Distinct SQL DISTINCT \u30e1\u30bd\u30c3\u30c9\u30c1\u30a7\u30fc\u30f3 \u5bfe\u5fdc \u975e\u5bfe\u5fdc \u52d5\u7684\u306a\u6761\u4ef6\u4ed8\u3051 \u7c21\u5358 \u8907\u96d1 \u30af\u30a8\u30ea\u30d3\u30eb\u30c0\u30fc\u7d71\u5408 \u30cd\u30a4\u30c6\u30a3\u30d6 \u624b\u52d5<\/li>\n\n\n\n<li>\u6a5f\u80fd\u7684\u306a\u7279\u5fb4<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Laravel\u3067\u306e\u62e1\u5f35\u6a5f\u80fd\n<ul class=\"wp-block-list\">\n<li>\u30ea\u30ec\u30fc\u30b7\u30e7\u30f3\u5185\u3067\u306e\u4f7f\u7528\u304c\u5bb9\u6613<\/li>\n\n\n\n<li>\u30af\u30a8\u30ea\u30b9\u30b3\u30fc\u30d7\u3068\u306e\u9023\u643a\u304c\u53ef\u80fd<\/li>\n\n\n\n<li>\u30e2\u30c7\u30eb\u30a4\u30d9\u30f3\u30c8\u3068\u306e\u9023\u643a\u304c\u53ef\u80fd<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u306e\u8003\u616e\u70b9<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Eloquent\u306e\u30aa\u30fc\u30d0\u30fc\u30d8\u30c3\u30c9\n<ul class=\"wp-block-list\">\n<li>\u30e2\u30c7\u30eb\u306e\u30cf\u30a4\u30c9\u30ec\u30fc\u30b7\u30e7\u30f3\u51e6\u7406\u304c\u8ffd\u52a0<\/li>\n\n\n\n<li>\u30e1\u30e2\u30ea\u4f7f\u7528\u91cf\u304c\u82e5\u5e72\u5897\u52a0<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>\u6700\u9069\u5316\u6a5f\u80fd\n<ul class=\"wp-block-list\">\n<li>\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u306e\u81ea\u52d5\u6d3b\u7528<\/li>\n\n\n\n<li>\u30af\u30a8\u30ea\u30ad\u30e3\u30c3\u30b7\u30e5\u306e\u5229\u7528<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<p>\u5b9f\u88c5\u4f8b\u3067\u306e\u9055\u3044\uff1a<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ Laravel\u3067\u306e\u5b9f\u88c5\n$uniqueEmails = User::distinct()\n    -&gt;select('email')\n    -&gt;where('active', true)\n    -&gt;get();\n\n\/\/ \u540c\u7b49\u306eSQL\nSELECT DISTINCT email \nFROM users \nWHERE active = true;<\/pre>\n\n\n\n<p>Laravel\u306eDistinct\u30e1\u30bd\u30c3\u30c9\u306f\u3001\u958b\u767a\u52b9\u7387\u3068\u30b3\u30fc\u30c9\u306e\u53ef\u8aad\u6027\u3092\u91cd\u8996\u3057\u3064\u3064\u3001SQL\u306eDISTINCT\u53e5\u306e\u6a5f\u80fd\u3092\u5b8c\u5168\u306b\u30ab\u30d0\u30fc\u3059\u308b\u5f62\u3067\u5b9f\u88c5\u3055\u308c\u3066\u3044\u307e\u3059\u3002\u30d5\u30ec\u30fc\u30e0\u30ef\u30fc\u30af\u306e\u6a5f\u80fd\u3092\u6d3b\u7528\u3059\u308b\u3053\u3068\u3067\u3001\u3088\u308a\u4fdd\u5b88\u6027\u306e\u9ad8\u3044\u30b3\u30fc\u30c9\u3092\u66f8\u304f\u3053\u3068\u304c\u3067\u304d\u3001\u304b\u3064\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u3082\u6700\u9069\u5316\u3055\u308c\u305f\u5f62\u3067\u5229\u7528\u3059\u308b\u3053\u3068\u304c\u53ef\u80fd\u3067\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-3\">distinct\u30e1\u30bd\u30c3\u30c9\u306e\u57fa\u672c\u7684\u306a\u4f7f\u3044\u65b9<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-4\">\u30b7\u30f3\u30d7\u30eb\u306a\u30ab\u30e9\u30e0\u3067\u306edistinct\u51e6\u7406<\/h3>\n\n\n\n<p>\u5358\u4e00\u306e\u30ab\u30e9\u30e0\u306b\u5bfe\u3059\u308bdistinct\u51e6\u7406\u306f\u3001\u6700\u3082\u57fa\u672c\u7684\u306a\u4f7f\u7528\u65b9\u6cd5\u3067\u3059\u3002\u4ee5\u4e0b\u306e\u3088\u3046\u306a\u5834\u9762\u3067\u6d3b\u7528\u3067\u304d\u307e\u3059\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u30e1\u30fc\u30eb\u30a2\u30c9\u30ec\u30b9\u306e\u91cd\u8907\u9664\u5916<\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ \u30e6\u30cb\u30fc\u30af\u306a\u30e1\u30fc\u30eb\u30a2\u30c9\u30ec\u30b9\u306e\u53d6\u5f97\n$uniqueEmails = DB::table('users')\n    -&gt;select('email')\n    -&gt;distinct()\n    -&gt;get();\n\n\/\/ \u7279\u5b9a\u306e\u6761\u4ef6\u4e0b\u3067\u306e\u30e6\u30cb\u30fc\u30af\u306a\u5024\u53d6\u5f97\n$activeUserEmails = User::query()\n    -&gt;select('email')\n    -&gt;where('status', 'active')\n    -&gt;distinct()\n    -&gt;get();<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li>\u30ab\u30c6\u30b4\u30ea\u30fc\u306e\u4e00\u89a7\u53d6\u5f97<\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ \u30e6\u30cb\u30fc\u30af\u306a\u30ab\u30c6\u30b4\u30ea\u30fc\u540d\u306e\u53d6\u5f97\n$uniqueCategories = Product::query()\n    -&gt;select('category_name')\n    -&gt;distinct()\n    -&gt;orderBy('category_name')\n    -&gt;get();<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-5\">\u8907\u6570\u30ab\u30e9\u30e0\u3092\u7d44\u307f\u5408\u308f\u305b\u305fdistinct\u51e6\u7406<\/h3>\n\n\n\n<p>\u8907\u6570\u306e\u30ab\u30e9\u30e0\u3092\u7d44\u307f\u5408\u308f\u305b\u308b\u3053\u3068\u3067\u3001\u3088\u308a\u8907\u96d1\u306a\u91cd\u8907\u9664\u5916\u304c\u53ef\u80fd\u306b\u306a\u308a\u307e\u3059\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u57fa\u672c\u7684\u306a\u8907\u6570\u30ab\u30e9\u30e0\u306e\u7d44\u307f\u5408\u308f\u305b<\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ \u90fd\u9053\u5e9c\u770c\u3068\u5e02\u533a\u753a\u6751\u306e\u7d44\u307f\u5408\u308f\u305b\u3092\u91cd\u8907\u306a\u3057\u3067\u53d6\u5f97\n$uniqueLocations = Address::query()\n    -&gt;select('prefecture', 'city')\n    -&gt;distinct()\n    -&gt;orderBy('prefecture')\n    -&gt;orderBy('city')\n    -&gt;get();<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li>\u96c6\u8a08\u95a2\u6570\u3068\u306e\u7d44\u307f\u5408\u308f\u305b<\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ \u90e8\u7f72\u3054\u3068\u306e\u56fa\u6709\u306e\u5f79\u8077\u6570\u3092\u53d6\u5f97\n$roleCountByDepartment = Employee::query()\n    -&gt;select('department')\n    -&gt;selectRaw('COUNT(DISTINCT role) as unique_roles')\n    -&gt;groupBy('department')\n    -&gt;get();<\/pre>\n\n\n\n<p>\u5b9f\u88c5\u6642\u306e\u6ce8\u610f\u70b9\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>select\u30b9\u30c6\u30fc\u30c8\u30e1\u30f3\u30c8\u306f\u5fc5\u305a\u6307\u5b9a\u3059\u308b<\/li>\n\n\n\n<li>\u9806\u5e8f\u306fwhere\u306e\u5f8c\u306bdistinct\u3092\u914d\u7f6e<\/li>\n\n\n\n<li>\u5fc5\u8981\u306a\u30ab\u30e9\u30e0\u306e\u307f\u3092\u9078\u629e\u3057\u3001\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u3092\u8003\u616e<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-6\">\u30ea\u30ec\u30fc\u30b7\u30e7\u30f3\u5185\u3067\u306edistinct\u6d3b\u7528\u6cd5<\/h3>\n\n\n\n<p>Laravel\u306e\u30ea\u30ec\u30fc\u30b7\u30e7\u30f3\u6a5f\u80fd\u3068\u7d44\u307f\u5408\u308f\u305b\u308b\u3053\u3068\u3067\u3001\u3088\u308a\u9ad8\u5ea6\u306a\u91cd\u8907\u9664\u5916\u304c\u53ef\u80fd\u306b\u306a\u308a\u307e\u3059\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>hasOne\u30ea\u30ec\u30fc\u30b7\u30e7\u30f3\u3067\u306e\u4f7f\u7528<\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ \u30e6\u30fc\u30b6\u30fc\u3054\u3068\u306e\u6700\u65b0\u306e\u6ce8\u6587\u3092\u91cd\u8907\u306a\u3057\u3067\u53d6\u5f97\n$latestOrders = User::query()\n    -&gt;select('users.*')\n    -&gt;distinct()\n    -&gt;join('orders', 'users.id', '=', 'orders.user_id')\n    -&gt;orderBy('orders.created_at', 'desc')\n    -&gt;get();<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li>hasMany\u30ea\u30ec\u30fc\u30b7\u30e7\u30f3\u3067\u306e\u4f7f\u7528<\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ \u5546\u54c1\u3092\u8cfc\u5165\u3057\u305f\u3053\u3068\u306e\u3042\u308b\u30e6\u30cb\u30fc\u30af\u306a\u9867\u5ba2\u3092\u53d6\u5f97\n$uniqueBuyers = Customer::query()\n    -&gt;select('customers.*')\n    -&gt;distinct()\n    -&gt;join('orders', 'customers.id', '=', 'orders.customer_id')\n    -&gt;has('orders')\n    -&gt;get();<\/pre>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li>belongsToMany\u3067\u306e\u6d3b\u7528<\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ \u7279\u5b9a\u306e\u6a29\u9650\u3092\u6301\u3064\u30e6\u30cb\u30fc\u30af\u306a\u5f79\u5272\u3092\u53d6\u5f97\n$uniqueRoles = Role::query()\n    -&gt;select('roles.*')\n    -&gt;distinct()\n    -&gt;join('role_permissions', 'roles.id', '=', 'role_permissions.role_id')\n    -&gt;where('role_permissions.permission_id', 1)\n    -&gt;get();<\/pre>\n\n\n\n<p>\u5b9f\u88c5\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9\uff1a<\/p>\n\n\n<div id=\"id-0ed1e0d9-8c6a-4631-b46b-a62ebf6fb504\">\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>\u72b6\u6cc1<\/th><th>\u63a8\u5968\u3055\u308c\u308b\u5b9f\u88c5\u65b9\u6cd5<\/th><th>\u6ce8\u610f\u70b9<\/th><\/tr><\/thead><tbody><tr><td>\u5358\u4e00\u30ab\u30e9\u30e0<\/td><td>\u30b7\u30f3\u30d7\u30eb\u306aselect + distinct<\/td><td>\u30ab\u30e9\u30e0\u540d\u3092\u660e\u793a\u7684\u306b\u6307\u5b9a<\/td><\/tr><tr><td>\u8907\u6570\u30ab\u30e9\u30e0<\/td><td>\u5fc5\u8981\u306a\u30ab\u30e9\u30e0\u306e\u307f\u3092\u9078\u629e<\/td><td>\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u306e\u6d3b\u7528\u3092\u8003\u616e<\/td><\/tr><tr><td>\u30ea\u30ec\u30fc\u30b7\u30e7\u30f3<\/td><td>join\u3092\u4f7f\u7528<\/td><td>N+1\u554f\u984c\u306b\u6ce8\u610f<\/td><\/tr><\/tbody><\/table><\/figure>\n<\/div>\n\n\n<p>\u30a8\u30e9\u30fc\u9632\u6b62\u306e\u305f\u3081\u306e\u30c1\u30a7\u30c3\u30af\u30ea\u30b9\u30c8\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u30ab\u30e9\u30e0\u540d\u304c\u6b63\u3057\u304f\u6307\u5b9a\u3055\u308c\u3066\u3044\u308b\u304b<\/li>\n\n\n\n<li>\u30ea\u30ec\u30fc\u30b7\u30e7\u30f3\u5b9a\u7fa9\u304c\u9069\u5207\u304b<\/li>\n\n\n\n<li>\u5fc5\u8981\u306a\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u304c\u8a2d\u5b9a\u3055\u308c\u3066\u3044\u308b\u304b<\/li>\n\n\n\n<li>\u30af\u30a8\u30ea\u306e\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u304c\u8003\u616e\u3055\u308c\u3066\u3044\u308b\u304b<\/li>\n<\/ol>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u57fa\u672c\u7684\u306a\u4f7f\u7528\u65b9\u6cd5\u3092\u7406\u89e3\u3059\u308b\u3053\u3068\u3067\u3001\u3088\u308a\u8907\u96d1\u306a\u30b1\u30fc\u30b9\u306b\u3082\u5bfe\u5fdc\u3067\u304d\u308b\u3088\u3046\u306b\u306a\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-7\">\u5b9f\u8df5\u7684\u306adistinct\u306e\u6d3b\u7528\u30b7\u30fc\u30f3<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-8\">\u91cd\u8907\u30c7\u30fc\u30bf\u306e\u52b9\u7387\u7684\u306a\u9664\u5916\u65b9\u6cd5<\/h3>\n\n\n\n<p>\u5b9f\u969b\u306e\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u3067\u3088\u304f\u906d\u9047\u3059\u308b\u91cd\u8907\u30c7\u30fc\u30bf\u306e\u9664\u5916\u30b7\u30ca\u30ea\u30aa\u3068\u3001\u305d\u306e\u52b9\u7387\u7684\u306a\u89e3\u6c7a\u65b9\u6cd5\u3092\u7d39\u4ecb\u3057\u307e\u3059\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u30ed\u30b0\u30c7\u30fc\u30bf\u304b\u3089\u306e\u30e6\u30cb\u30fc\u30af\u30a2\u30af\u30bb\u30b9\u62bd\u51fa<\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ \u65e5\u4ed8\u5225\u306e\u30e6\u30cb\u30fc\u30af\u30a2\u30af\u30bb\u30b9IP\u30a2\u30c9\u30ec\u30b9\u6570\u3092\u53d6\u5f97\n$uniqueVisitors = AccessLog::query()\n    -&gt;select(DB::raw('DATE(created_at) as date'))\n    -&gt;selectRaw('COUNT(DISTINCT ip_address) as unique_visitors')\n    -&gt;groupBy('date')\n    -&gt;orderBy('date', 'desc')\n    -&gt;get();<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li>\u91cd\u8907\u30a8\u30f3\u30c8\u30ea\u306e\u691c\u51fa\u3068\u7ba1\u7406<\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ \u91cd\u8907\u3059\u308b\u53ef\u80fd\u6027\u306e\u3042\u308b\u9867\u5ba2\u30c7\u30fc\u30bf\u3092\u691c\u51fa\n$duplicateCustomers = Customer::query()\n    -&gt;select('email')\n    -&gt;selectRaw('COUNT(*) as count')\n    -&gt;groupBy('email')\n    -&gt;having('count', '&gt;', 1)\n    -&gt;get();\n\n\/\/ \u91cd\u8907\u3092\u9664\u5916\u3057\u3066\u6700\u65b0\u306e\u30ec\u30b3\u30fc\u30c9\u306e\u307f\u3092\u53d6\u5f97\n$latestCustomers = Customer::query()\n    -&gt;select('email')\n    -&gt;selectRaw('MAX(id) as latest_id')\n    -&gt;groupBy('email')\n    -&gt;get()\n    -&gt;pluck('latest_id');\n\n$uniqueCustomers = Customer::whereIn('id', $latestCustomers)-&gt;get();<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-9\">\u96c6\u8a08\u51e6\u7406\u3067\u306e\u6d3b\u7528\u30c6\u30af\u30cb\u30c3\u30af<\/h3>\n\n\n\n<p>\u96c6\u8a08\u51e6\u7406\u3067distinct\u3092\u52b9\u679c\u7684\u306b\u6d3b\u7528\u3059\u308b\u65b9\u6cd5\u3092\u7d39\u4ecb\u3057\u307e\u3059\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u671f\u9593\u5225\u306e\u96c6\u8a08<\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ \u6708\u5225\u306e\u30e6\u30cb\u30fc\u30af\u30e6\u30fc\u30b6\u30fc\u6570\u3092\u96c6\u8a08\n$monthlyUniqueUsers = AccessLog::query()\n    -&gt;select(DB::raw('DATE_FORMAT(created_at, \"%Y-%m\") as month'))\n    -&gt;selectRaw('COUNT(DISTINCT user_id) as unique_users')\n    -&gt;groupBy('month')\n    -&gt;orderBy('month', 'desc')\n    -&gt;get();\n\n\/\/ \u9031\u5225\u306e\u96c6\u8a08\u3068\u524d\u9031\u6bd4\u8f03\n$weeklyStats = Order::query()\n    -&gt;select(DB::raw('YEARWEEK(created_at) as week'))\n    -&gt;selectRaw('COUNT(DISTINCT customer_id) as unique_customers')\n    -&gt;selectRaw('SUM(total_amount) as total_sales')\n    -&gt;groupBy('week')\n    -&gt;orderBy('week', 'desc')\n    -&gt;limit(10)\n    -&gt;get();<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li>\u30ab\u30c6\u30b4\u30ea\u5225\u306e\u96c6\u8a08<\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ \u5546\u54c1\u30ab\u30c6\u30b4\u30ea\u5225\u306e\u30e6\u30cb\u30fc\u30af\u8cfc\u5165\u8005\u6570\n$categoryStats = Order::query()\n    -&gt;join('products', 'orders.product_id', '=', 'products.id')\n    -&gt;select('products.category')\n    -&gt;selectRaw('COUNT(DISTINCT orders.customer_id) as unique_buyers')\n    -&gt;selectRaw('SUM(orders.quantity) as total_quantity')\n    -&gt;groupBy('products.category')\n    -&gt;get();<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-10\">\u5927\u898f\u6a21\u30c7\u30fc\u30bf\u30bb\u30c3\u30c8\u3067\u306e\u4f7f\u7528\u65b9\u6cd5<\/h3>\n\n\n\n<p>\u5927\u91cf\u306e\u30c7\u30fc\u30bf\u3092\u6271\u3046\u969b\u306e\u52b9\u7387\u7684\u306adistinct\u51e6\u7406\u306e\u5b9f\u88c5\u65b9\u6cd5\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u30c1\u30e3\u30f3\u30af\u51e6\u7406\u306b\u3088\u308b\u5927\u898f\u6a21\u30c7\u30fc\u30bf\u306e\u53d6\u308a\u6271\u3044<\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ \u5927\u898f\u6a21\u306a\u30ed\u30b0\u30c7\u30fc\u30bf\u304b\u3089\u30e6\u30cb\u30fc\u30af\u30e6\u30fc\u30b6\u30fc\u3092\u62bd\u51fa\nUser::query()\n    -&gt;select('id', 'email')\n    -&gt;distinct()\n    -&gt;chunk(1000, function ($users) {\n        foreach ($users as $user) {\n            \/\/ \u5404\u30e6\u30fc\u30b6\u30fc\u306b\u5bfe\u3059\u308b\u51e6\u7406\n            ProcessUserData::dispatch($user);\n        }\n    });<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li>\u30b9\u30c8\u30ea\u30fc\u30df\u30f3\u30b0\u51e6\u7406\u3068\u306e\u7d44\u307f\u5408\u308f\u305b<\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ \u30e1\u30e2\u30ea\u52b9\u7387\u306e\u826f\u3044\u30b9\u30c8\u30ea\u30fc\u30df\u30f3\u30b0\u51e6\u7406\n$stream = User::query()\n    -&gt;select('email')\n    -&gt;distinct()\n    -&gt;lazyById(1000)\n    -&gt;filter(function ($user) {\n        return filter_var($user-&gt;email, FILTER_VALIDATE_EMAIL);\n    });\n\nforeach ($stream as $user) {\n    \/\/ \u5404\u30e6\u30fc\u30b6\u30fc\u306e\u30e1\u30fc\u30eb\u30a2\u30c9\u30ec\u30b9\u3092\u51e6\u7406\n}<\/pre>\n\n\n\n<p>\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u6700\u9069\u5316\u306e\u30dd\u30a4\u30f3\u30c8\uff1a<\/p>\n\n\n<div id=\"id-6b2dd198-444d-4a32-aed2-0049819859cd\">\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>\u51e6\u7406\u5185\u5bb9<\/th><th>\u6700\u9069\u5316\u65b9\u6cd5<\/th><th>\u671f\u5f85\u3055\u308c\u308b\u52b9\u679c<\/th><\/tr><\/thead><tbody><tr><td>\u5927\u898f\u6a21\u30c7\u30fc\u30bf\u306e\u53d6\u5f97<\/td><td>\u30c1\u30e3\u30f3\u30af\u51e6\u7406<\/td><td>\u30e1\u30e2\u30ea\u4f7f\u7528\u91cf\u306e\u524a\u6e1b<\/td><\/tr><tr><td>\u30ea\u30a2\u30eb\u30bf\u30a4\u30e0\u96c6\u8a08<\/td><td>\u30ad\u30e3\u30c3\u30b7\u30e5\u306e\u6d3b\u7528<\/td><td>\u30ec\u30b9\u30dd\u30f3\u30b9\u6642\u9593\u306e\u77ed\u7e2e<\/td><\/tr><tr><td>\u5b9a\u671f\u30d0\u30c3\u30c1\u51e6\u7406<\/td><td>\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u306e\u6d3b\u7528<\/td><td>\u51e6\u7406\u6642\u9593\u306e\u77ed\u7e2e<\/td><\/tr><\/tbody><\/table><\/figure>\n<\/div>\n\n\n<p>\u5b9f\u88c5\u6642\u306e\u6ce8\u610f\u4e8b\u9805\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u30e1\u30e2\u30ea\u4f7f\u7528\u91cf\u306e\u76e3\u8996<\/li>\n\n\n\n<li>\u9069\u5207\u306a\u30c1\u30e3\u30f3\u30af\u30b5\u30a4\u30ba\u306e\u9078\u5b9a<\/li>\n\n\n\n<li>\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u306e\u52b9\u679c\u7684\u306a\u6d3b\u7528<\/li>\n\n\n\n<li>\u30ad\u30e3\u30c3\u30b7\u30e5\u6226\u7565\u306e\u691c\u8a0e<\/li>\n<\/ol>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u5b9f\u8df5\u7684\u306a\u5b9f\u88c5\u4f8b\u3092\u53c2\u8003\u306b\u3001\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u306e\u8981\u4ef6\u306b\u5fdc\u3058\u305f\u6700\u9069\u306a\u5b9f\u88c5\u3092\u9078\u629e\u3057\u3066\u304f\u3060\u3055\u3044\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-11\">distinct\u30e1\u30bd\u30c3\u30c9\u306e\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u6700\u9069\u5316<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-12\">\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u8a2d\u8a08\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9<\/h3>\n\n\n\n<p>distinct\u30af\u30a8\u30ea\u306e\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u3092\u6700\u5927\u9650\u306b\u5f15\u304d\u51fa\u3059\u305f\u3081\u306e\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u8a2d\u8a08\u306b\u3064\u3044\u3066\u89e3\u8aac\u3057\u307e\u3059\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u5358\u4e00\u30ab\u30e9\u30e0\u306e\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u8a2d\u8a08<\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ \u30de\u30a4\u30b0\u30ec\u30fc\u30b7\u30e7\u30f3\u3067\u306e\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u8a2d\u5b9a\nSchema::table('users', function (Blueprint $table) {\n    \/\/ distinct\u3067\u3088\u304f\u4f7f\u7528\u3055\u308c\u308b\u30ab\u30e9\u30e0\u306b\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u3092\u8ffd\u52a0\n    $table-&gt;index('email');\n    $table-&gt;index(['status', 'email']); \/\/ \u8907\u5408\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\n});\n\n\/\/ \u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u3092\u6d3b\u7528\u3057\u305f\u30af\u30a8\u30ea\u4f8b\n$uniqueActiveEmails = User::query()\n    -&gt;select('email')\n    -&gt;where('status', 'active')\n    -&gt;distinct()\n    -&gt;get();<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li>\u8907\u5408\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u306e\u52b9\u679c\u7684\u306a\u8a2d\u8a08<\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ \u8907\u6570\u30ab\u30e9\u30e0\u3092\u4f7f\u7528\u3059\u308b\u5834\u5408\u306e\u6700\u9069\u306a\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u8a2d\u8a08\nSchema::table('orders', function (Blueprint $table) {\n    \/\/ \u983b\u7e41\u306b\u4f7f\u7528\u3055\u308c\u308b\u7d44\u307f\u5408\u308f\u305b\u306b\u5bfe\u3059\u308b\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\n    $table-&gt;index(['customer_id', 'product_id', 'created_at']);\n});\n\n\/\/ \u8907\u5408\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u3092\u6d3b\u7528\u3057\u305f\u30af\u30a8\u30ea\n$uniqueOrders = Order::query()\n    -&gt;select('customer_id', 'product_id')\n    -&gt;whereYear('created_at', '2024')\n    -&gt;distinct()\n    -&gt;get();<\/pre>\n\n\n\n<p>\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u8a2d\u8a08\u306e\u30c1\u30a7\u30c3\u30af\u30ea\u30b9\u30c8\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30ab\u30e9\u30e0\u306e\u9078\u629e\u9806\u5e8f\u306e\u6700\u9069\u5316<\/li>\n\n\n\n<li>\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u30b5\u30a4\u30ba\u306e\u8003\u616e<\/li>\n\n\n\n<li>\u66f4\u65b0\u983b\u5ea6\u3068\u306e\u30d0\u30e9\u30f3\u30b9<\/li>\n\n\n\n<li>\u4f7f\u7528\u983b\u5ea6\u306e\u5206\u6790<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-13\">\u30e1\u30e2\u30ea\u4f7f\u7528\u91cf\u3092\u6291\u3048\u308b\u30c6\u30af\u30cb\u30c3\u30af<\/h3>\n\n\n\n<p>\u5927\u898f\u6a21\u306a\u30c7\u30fc\u30bf\u30bb\u30c3\u30c8\u3092\u6271\u3046\u969b\u306e\u30e1\u30e2\u30ea\u6700\u9069\u5316\u624b\u6cd5\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u30ab\u30fc\u30bd\u30eb\u306e\u6d3b\u7528<\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ \u30e1\u30e2\u30ea\u52b9\u7387\u306e\u826f\u3044\u30ab\u30fc\u30bd\u30eb\u51e6\u7406\nUser::query()\n    -&gt;select('id', 'email')\n    -&gt;distinct()\n    -&gt;orderBy('id')\n    -&gt;cursor()\n    -&gt;each(function ($user) {\n        \/\/ \u4f4e\u30e1\u30e2\u30ea\u3067\u5927\u91cf\u30c7\u30fc\u30bf\u3092\u51e6\u7406\n        ProcessUserData::dispatch($user);\n    });<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li>\u30c1\u30e3\u30f3\u30af\u51e6\u7406\u306e\u5b9f\u88c5<\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ \u6700\u9069\u306a\u30c1\u30e3\u30f3\u30af\u30b5\u30a4\u30ba\u3067\u306e\u51e6\u7406\n$chunkSize = 1000;\nOrder::query()\n    -&gt;select('customer_id')\n    -&gt;distinct()\n    -&gt;orderBy('customer_id')\n    -&gt;chunk($chunkSize, function ($orders) {\n        foreach ($orders as $order) {\n            \/\/ \u30d0\u30c3\u30c1\u51e6\u7406\u306e\u5b9f\u88c5\n            AnalyzeCustomerOrder::dispatch($order);\n        }\n    });<\/pre>\n\n\n\n<p>\u30e1\u30e2\u30ea\u4f7f\u7528\u91cf\u6700\u9069\u5316\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9\uff1a<\/p>\n\n\n<div id=\"id-ed6d8514-2071-42ae-8c7c-ee8dee401c15\">\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>\u624b\u6cd5<\/th><th>\u7528\u9014<\/th><th>\u30e1\u30ea\u30c3\u30c8<\/th><th>\u30c7\u30e1\u30ea\u30c3\u30c8<\/th><\/tr><\/thead><tbody><tr><td>\u30ab\u30fc\u30bd\u30eb<\/td><td>\u5927\u898f\u6a21\u30c7\u30fc\u30bf\u306e\u9010\u6b21\u51e6\u7406<\/td><td>\u4f4e\u30e1\u30e2\u30ea\u6d88\u8cbb<\/td><td>\u30c8\u30e9\u30f3\u30b6\u30af\u30b7\u30e7\u30f3\u5fc5\u8981<\/td><\/tr><tr><td>\u30c1\u30e3\u30f3\u30af<\/td><td>\u30d0\u30c3\u30c1\u51e6\u7406<\/td><td>\u5236\u5fa1\u304c\u5bb9\u6613<\/td><td>\u82e5\u5e72\u306e\u30aa\u30fc\u30d0\u30fc\u30d8\u30c3\u30c9<\/td><\/tr><tr><td>LazyCollection<\/td><td>\u30b9\u30c8\u30ea\u30fc\u30df\u30f3\u30b0\u51e6\u7406<\/td><td>\u30e1\u30e2\u30ea\u52b9\u7387\u304c\u826f\u3044<\/td><td>\u4e00\u90e8\u6a5f\u80fd\u5236\u9650\u3042\u308a<\/td><\/tr><\/tbody><\/table><\/figure>\n<\/div>\n\n\n<h3 class=\"wp-block-heading\" id=\"i-14\">N+1\u554f\u984c\u3092\u56de\u907f\u3059\u308b\u5b9f\u88c5\u65b9\u6cd5<\/h3>\n\n\n\n<p>distinct\u30e1\u30bd\u30c3\u30c9\u3092\u4f7f\u7528\u3059\u308b\u969b\u306eN+1\u554f\u984c\u5bfe\u7b56\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Eager\u30ed\u30fc\u30c7\u30a3\u30f3\u30b0\u306e\u9069\u5207\u306a\u4f7f\u7528<\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ N+1\u554f\u984c\u3092\u56de\u907f\u3059\u308bEager\u30ed\u30fc\u30c7\u30a3\u30f3\u30b0\n$uniqueOrders = Order::query()\n    -&gt;select('customer_id')\n    -&gt;with(['customer' =&gt; function ($query) {\n        $query-&gt;select('id', 'name', 'email');\n    }])\n    -&gt;distinct()\n    -&gt;get();\n\n\/\/ \u30ea\u30ec\u30fc\u30b7\u30e7\u30f3\u5148\u306e\u30c7\u30fc\u30bf\u3082\u542b\u3081\u305f\u91cd\u8907\u9664\u5916\n$uniqueCustomers = Customer::query()\n    -&gt;select('customers.*')\n    -&gt;distinct()\n    -&gt;join('orders', 'customers.id', '=', 'orders.customer_id')\n    -&gt;with(['orders' =&gt; function ($query) {\n        $query-&gt;select('id', 'customer_id', 'total_amount');\n    }])\n    -&gt;get();<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li>\u30b5\u30d6\u30af\u30a8\u30ea\u306e\u6700\u9069\u5316<\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ \u52b9\u7387\u7684\u306a\u30b5\u30d6\u30af\u30a8\u30ea\u306e\u4f7f\u7528\n$latestOrders = Order::query()\n    -&gt;select('customer_id')\n    -&gt;distinct()\n    -&gt;whereIn('id', function ($query) {\n        $query-&gt;select(DB::raw('MAX(id)'))\n            -&gt;from('orders')\n            -&gt;groupBy('customer_id');\n    })\n    -&gt;with('customer:id,name,email')\n    -&gt;get();<\/pre>\n\n\n\n<p>\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u30e2\u30cb\u30bf\u30ea\u30f3\u30b0\u306e\u30dd\u30a4\u30f3\u30c8\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u30af\u30a8\u30ea\u30ed\u30b0\u306e\u5206\u6790<\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ \u30af\u30a8\u30ea\u30ed\u30b0\u306e\u6709\u52b9\u5316\uff08\u958b\u767a\u74b0\u5883\uff09\nDB::enableQueryLog();\n\n\/\/ \u30af\u30a8\u30ea\u306e\u5b9f\u884c\n$result = User::distinct()-&gt;get(['email']);\n\n\/\/ \u5b9f\u884c\u3055\u308c\u305f\u30af\u30a8\u30ea\u306e\u78ba\u8a8d\ndd(DB::getQueryLog());<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li>\u5b9f\u884c\u8a08\u753b\u306e\u78ba\u8a8d<\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ \u5b9f\u884c\u8a08\u753b\u306e\u53d6\u5f97\n$explainResults = DB::select('EXPLAIN SELECT DISTINCT email FROM users WHERE status = ?', ['active']);\n\n\/\/ \u5b9f\u884c\u8a08\u753b\u306e\u5206\u6790\nforeach ($explainResults as $result) {\n    \/\/ \u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u306e\u4f7f\u7528\u72b6\u6cc1\u306a\u3069\u3092\u78ba\u8a8d\n    Log::info('Query execution plan:', (array) $result);\n}<\/pre>\n\n\n\n<p>\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u6700\u9069\u5316\u30c1\u30a7\u30c3\u30af\u30ea\u30b9\u30c8\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u9069\u5207\u306a\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u306e\u5b58\u5728\u78ba\u8a8d<\/li>\n\n\n\n<li>\u30e1\u30e2\u30ea\u4f7f\u7528\u91cf\u306e\u30e2\u30cb\u30bf\u30ea\u30f3\u30b0<\/li>\n\n\n\n<li>N+1\u554f\u984c\u306e\u6709\u7121\u30c1\u30a7\u30c3\u30af<\/li>\n\n\n\n<li>\u30af\u30a8\u30ea\u5b9f\u884c\u6642\u9593\u306e\u6e2c\u5b9a<\/li>\n\n\n\n<li>\u5b9f\u884c\u8a08\u753b\u306e\u5b9a\u671f\u7684\u306a\u78ba\u8a8d<\/li>\n<\/ol>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u6700\u9069\u5316\u30c6\u30af\u30cb\u30c3\u30af\u3092\u9069\u5207\u306b\u7d44\u307f\u5408\u308f\u305b\u308b\u3053\u3068\u3067\u3001distinct\u30e1\u30bd\u30c3\u30c9\u3092\u4f7f\u7528\u3059\u308b\u969b\u306e\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u3092\u5927\u5e45\u306b\u6539\u5584\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-15\">distinct\u30e1\u30bd\u30c3\u30c9\u306e\u5fdc\u7528\u30c6\u30af\u30cb\u30c3\u30af<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-16\">\u30b5\u30d6\u30af\u30a8\u30ea\u3067\u306edistinct\u6d3b\u7528\u6cd5<\/h3>\n\n\n\n<p>\u3088\u308a\u8907\u96d1\u306a\u8981\u4ef6\u306b\u5bfe\u5fdc\u3059\u308b\u305f\u3081\u306e\u30b5\u30d6\u30af\u30a8\u30ea\u3067\u306edistinct\u6d3b\u7528\u65b9\u6cd5\u3092\u89e3\u8aac\u3057\u307e\u3059\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u76f8\u95a2\u30b5\u30d6\u30af\u30a8\u30ea\u3067\u306e\u4f7f\u7528<\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ \u5404\u30ab\u30c6\u30b4\u30ea\u3067\u6700\u3082\u58f2\u308c\u3066\u3044\u308b\u5546\u54c1\u3092\u53d6\u5f97\n$topProducts = Category::query()\n    -&gt;select('categories.*')\n    -&gt;addSelect([\n        'best_selling_product' =&gt; Product::query()\n            -&gt;select('name')\n            -&gt;whereColumn('category_id', 'categories.id')\n            -&gt;orderByDesc(\n                Order::query()\n                    -&gt;selectRaw('COUNT(DISTINCT customer_id)')\n                    -&gt;whereColumn('product_id', 'products.id')\n            )\n            -&gt;limit(1)\n    ])\n    -&gt;get();<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li>\u6d3e\u751f\u30c6\u30fc\u30d6\u30eb\u3067\u306e\u6d3b\u7528<\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ \u904e\u53bb3\u30f6\u6708\u9593\u306e\u6708\u5225\u30e6\u30cb\u30fc\u30af\u30e6\u30fc\u30b6\u30fc\u6570\u306e\u63a8\u79fb\n$monthlyStats = DB::query()\n    -&gt;fromSub(function ($query) {\n        $query-&gt;from('access_logs')\n            -&gt;select(\n                DB::raw('DATE_FORMAT(created_at, \"%Y-%m\") as month'),\n                DB::raw('COUNT(DISTINCT user_id) as unique_users')\n            )\n            -&gt;where('created_at', '&gt;=', now()-&gt;subMonths(3))\n            -&gt;groupBy('month');\n    }, 'monthly_stats')\n    -&gt;orderBy('month')\n    -&gt;get();<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-17\">\u30bd\u30fc\u30c8\u51e6\u7406\u3068\u7d44\u307f\u5408\u308f\u305b\u305f\u5b9f\u88c5\u4f8b<\/h3>\n\n\n\n<p>\u30bd\u30fc\u30c8\u51e6\u7406\u3092\u52b9\u679c\u7684\u306b\u7d44\u307f\u5408\u308f\u305b\u308b\u9ad8\u5ea6\u306a\u30c6\u30af\u30cb\u30c3\u30af\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u8907\u6570\u6761\u4ef6\u3067\u306e\u30bd\u30fc\u30c8<\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ \u90e8\u7f72\u3054\u3068\u306e\u56fa\u6709\u306e\u5f79\u8077\u6570\u3092\u7d66\u4e0e\u30ec\u30f3\u30b8\u3067\u4e26\u3073\u66ff\u3048\n$departmentRoles = Department::query()\n    -&gt;select('departments.*')\n    -&gt;addSelect([\n        'unique_roles' =&gt; Employee::query()\n            -&gt;selectRaw('COUNT(DISTINCT role)')\n            -&gt;whereColumn('department_id', 'departments.id')\n    ])\n    -&gt;addSelect([\n        'avg_salary' =&gt; Employee::query()\n            -&gt;selectRaw('AVG(salary)')\n            -&gt;whereColumn('department_id', 'departments.id')\n    ])\n    -&gt;orderByDesc('unique_roles')\n    -&gt;orderByDesc('avg_salary')\n    -&gt;get();<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li>Window\u95a2\u6570\u3068\u306e\u7d44\u307f\u5408\u308f\u305b<\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ \u6708\u5225\u306e\u4e0a\u4f4d\u9867\u5ba2\uff08\u30e6\u30cb\u30fc\u30af\u6ce8\u6587\u6570\u57fa\u6e96\uff09\n$topCustomers = DB::query()\n    -&gt;select(\n        'month',\n        'customer_id',\n        'unique_orders',\n        DB::raw('ROW_NUMBER() OVER (PARTITION BY month ORDER BY unique_orders DESC) as rank')\n    )\n    -&gt;fromSub(function ($query) {\n        $query-&gt;from('orders')\n            -&gt;select(\n                DB::raw('DATE_FORMAT(created_at, \"%Y-%m\") as month'),\n                'customer_id',\n                DB::raw('COUNT(DISTINCT id) as unique_orders')\n            )\n            -&gt;groupBy('month', 'customer_id');\n    }, 'monthly_stats')\n    -&gt;having('rank', '&lt;=', 5)\n    -&gt;orderBy('month')\n    -&gt;orderBy('rank')\n    -&gt;get();<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-18\">\u30ad\u30e3\u30c3\u30b7\u30e5\u3092\u6d3b\u7528\u3057\u305f\u9ad8\u901f\u5316\u624b\u6cd5<\/h3>\n\n\n\n<p>\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u3092\u5411\u4e0a\u3055\u305b\u308b\u30ad\u30e3\u30c3\u30b7\u30e5\u6226\u7565\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Results Caching<\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ \u30ad\u30e3\u30c3\u30b7\u30e5\u3092\u6d3b\u7528\u3057\u305f\u7d50\u679c\u306e\u4fdd\u5b58\n$uniqueCategories = Cache::remember('unique_categories', 3600, function () {\n    return Product::query()\n        -&gt;select('category')\n        -&gt;distinct()\n        -&gt;orderBy('category')\n        -&gt;get()\n        -&gt;pluck('category');\n});\n\n\/\/ \u30bf\u30b0\u4ed8\u304d\u30ad\u30e3\u30c3\u30b7\u30e5\u306e\u5b9f\u88c5\n$uniqueProducts = Cache::tags(['products', 'catalog'])-&gt;remember(\n    'unique_products', \n    now()-&gt;addHours(24), \n    function () {\n        return Product::query()\n            -&gt;select('id', 'name', 'category')\n            -&gt;distinct()\n            -&gt;where('status', 'active')\n            -&gt;get();\n    }\n);<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li>Query Cache<\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ \u30af\u30a8\u30ea\u30ad\u30e3\u30c3\u30b7\u30e5\u306e\u6d3b\u7528\n$expensiveQuery = Product::query()\n    -&gt;select('category', 'brand')\n    -&gt;distinct()\n    -&gt;whereHas('orders', function ($query) {\n        $query-&gt;whereYear('created_at', now()-&gt;year);\n    })\n    -&gt;whereHas('reviews', function ($query) {\n        $query-&gt;where('rating', '&gt;=', 4);\n    })\n    -&gt;remember(60) \/\/ 1\u5206\u9593\u30ad\u30e3\u30c3\u30b7\u30e5\n    -&gt;get();<\/pre>\n\n\n\n<p>\u9ad8\u5ea6\u306a\u5b9f\u88c5\u30c6\u30af\u30cb\u30c3\u30af\u4e00\u89a7\uff1a<\/p>\n\n\n<div id=\"id-31401db6-ff16-41b2-be74-f3cb2ba1db96\">\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>\u30c6\u30af\u30cb\u30c3\u30af<\/th><th>\u4f7f\u7528\u30b7\u30fc\u30f3<\/th><th>\u4e3b\u306a\u30e1\u30ea\u30c3\u30c8<\/th><\/tr><\/thead><tbody><tr><td>\u30b5\u30d6\u30af\u30a8\u30ea<\/td><td>\u8907\u96d1\u306a\u96c6\u8a08<\/td><td>\u67d4\u8edf\u306a\u6761\u4ef6\u6307\u5b9a<\/td><\/tr><tr><td>Window\u95a2\u6570<\/td><td>\u30e9\u30f3\u30ad\u30f3\u30b0\u4f5c\u6210<\/td><td>\u52b9\u7387\u7684\u306a\u9806\u4f4d\u4ed8\u3051<\/td><\/tr><tr><td>\u30ad\u30e3\u30c3\u30b7\u30e5<\/td><td>\u983b\u7e41\u306a\u30a2\u30af\u30bb\u30b9<\/td><td>\u30ec\u30b9\u30dd\u30f3\u30b9\u5411\u4e0a<\/td><\/tr><tr><td>\u76f8\u95a2\u30b5\u30d6\u30af\u30a8\u30ea<\/td><td>\u95a2\u9023\u30c7\u30fc\u30bf\u53d6\u5f97<\/td><td>\u30c7\u30fc\u30bf\u306e\u4e00\u8cab\u6027<\/td><\/tr><\/tbody><\/table><\/figure>\n<\/div>\n\n\n<p>\u5b9f\u88c5\u6642\u306e\u6ce8\u610f\u70b9\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u30b5\u30d6\u30af\u30a8\u30ea\u306e\u9069\u5207\u306a\u4f7f\u7528<\/li>\n\n\n\n<li>\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u306e\u52b9\u679c\u7684\u306a\u6d3b\u7528<\/li>\n\n\n\n<li>\u30ad\u30e3\u30c3\u30b7\u30e5\u6226\u7565\u306e\u691c\u8a0e<\/li>\n\n\n\n<li>\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u306e\u76e3\u8996<\/li>\n<\/ol>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u5fdc\u7528\u30c6\u30af\u30cb\u30c3\u30af\u3092\u6d3b\u7528\u3059\u308b\u3053\u3068\u3067\u3001\u3088\u308a\u8907\u96d1\u306a\u8981\u4ef6\u306b\u3082\u5bfe\u5fdc\u53ef\u80fd\u306a\u5805\u7262\u306a\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092\u69cb\u7bc9\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-19\">\u3088\u304f\u3042\u308b\u30a8\u30e9\u30fc\u3068\u89e3\u6c7a\u65b9\u6cd5<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-20\">\u5b9f\u884c\u6642\u30a8\u30e9\u30fc\u306e\u539f\u56e0\u3068\u5bfe\u51e6\u6cd5<\/h3>\n\n\n\n<p>distinct\u4f7f\u7528\u6642\u306b\u3088\u304f\u906d\u9047\u3059\u308b\u30a8\u30e9\u30fc\u3068\u305d\u306e\u89e3\u6c7a\u65b9\u6cd5\u3092\u89e3\u8aac\u3057\u307e\u3059\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u30ab\u30e9\u30e0\u6307\u5b9a\u306b\u95a2\u3059\u308b\u30a8\u30e9\u30fc<\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ \u30a8\u30e9\u30fc\u4f8b\uff1aUndefined column\n$users = User::query()\n    -&gt;distinct()\n    -&gt;get(['non_existent_column']); \/\/ \u5b58\u5728\u3057\u306a\u3044\u30ab\u30e9\u30e0\u3092\u6307\u5b9a\n\n\/\/ \u6b63\u3057\u3044\u5b9f\u88c5\n$users = User::query()\n    -&gt;distinct()\n    -&gt;get(['email', 'status']); \/\/ \u5b9f\u5728\u3059\u308b\u30ab\u30e9\u30e0\u3092\u6307\u5b9a\n\n\/\/ \u30a8\u30e9\u30fc\u56de\u907f\u306e\u305f\u3081\u306e\u30ab\u30e9\u30e0\u5b58\u5728\u78ba\u8a8d\nif (Schema::hasColumn('users', 'email')) {\n    $users = User::query()\n        -&gt;distinct()\n        -&gt;get(['email']);\n}<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li>\u30e1\u30e2\u30ea\u5236\u9650\u30a8\u30e9\u30fc<\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ \u30e1\u30e2\u30ea\u4e0d\u8db3\u3092\u5f15\u304d\u8d77\u3053\u3059\u5b9f\u88c5\n$allRecords = BigTable::distinct()-&gt;get(); \/\/ \u5371\u967a\uff1a\u5168\u30c7\u30fc\u30bf\u3092\u30e1\u30e2\u30ea\u306b\u8aad\u307f\u8fbc\u3080\n\n\/\/ \u6539\u5584\u7b56\uff1a\u30c1\u30e3\u30f3\u30af\u51e6\u7406\u306e\u5b9f\u88c5\nBigTable::query()\n    -&gt;select('id', 'category')\n    -&gt;distinct()\n    -&gt;chunk(1000, function ($records) {\n        foreach ($records as $record) {\n            \/\/ \u30e1\u30e2\u30ea\u52b9\u7387\u306e\u826f\u3044\u51e6\u7406\n            ProcessRecord::dispatch($record);\n        }\n    });<\/pre>\n\n\n\n<p>\u3088\u304f\u3042\u308b\u30a8\u30e9\u30fc\u3068\u5bfe\u51e6\u6cd5\u4e00\u89a7\uff1a<\/p>\n\n\n<div id=\"id-e1273160-6e8d-43bd-865f-17dfe07adb70\">\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>\u30a8\u30e9\u30fc\u7a2e\u985e<\/th><th>\u4e3b\u306a\u539f\u56e0<\/th><th>\u5bfe\u51e6\u65b9\u6cd5<\/th><\/tr><\/thead><tbody><tr><td>Column not found<\/td><td>\u30ab\u30e9\u30e0\u540d\u306e\u8aa4\u6307\u5b9a<\/td><td>\u30b9\u30ad\u30fc\u30de\u306e\u78ba\u8a8d<\/td><\/tr><tr><td>Memory limit exceeded<\/td><td>\u30c7\u30fc\u30bf\u91cf\u904e\u591a<\/td><td>\u30c1\u30e3\u30f3\u30af\u51e6\u7406\u306e\u5c0e\u5165<\/td><\/tr><tr><td>Syntax error<\/td><td>SQL\u30af\u30a8\u30ea\u306e\u69cb\u6587\u30df\u30b9<\/td><td>\u30af\u30a8\u30ea\u30d3\u30eb\u30c0\u30fc\u306e\u4f7f\u7528<\/td><\/tr><tr><td>Timeout<\/td><td>\u51e6\u7406\u6642\u9593\u8d85\u904e<\/td><td>\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u6700\u9069\u5316<\/td><\/tr><\/tbody><\/table><\/figure>\n<\/div>\n\n\n<h3 class=\"wp-block-heading\" id=\"i-21\">\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u4f4e\u4e0b\u6642\u306e\u30c7\u30d0\u30c3\u30b0\u65b9\u6cd5<\/h3>\n\n\n\n<p>\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u554f\u984c\u306e\u7279\u5b9a\u3068\u89e3\u6c7a\u65b9\u6cd5\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u30af\u30a8\u30ea\u30ed\u30b0\u306e\u5206\u6790<\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ \u30c7\u30d0\u30c3\u30b0\u30e2\u30fc\u30c9\u3067\u306e\u30af\u30a8\u30ea\u30ed\u30b0\u53d6\u5f97\nDB::enableQueryLog();\n\n$result = Product::query()\n    -&gt;distinct()\n    -&gt;with('category')\n    -&gt;get();\n\n\/\/ \u30af\u30a8\u30ea\u306e\u5b9f\u884c\u6642\u9593\u3068\u8a73\u7d30\u3092\u78ba\u8a8d\n$queries = DB::getQueryLog();\nforeach ($queries as $query) {\n    Log::debug('Query:', [\n        'sql' =&gt; $query['query'],\n        'bindings' =&gt; $query['bindings'],\n        'time' =&gt; $query['time']\n    ]);\n}<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li>\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u30d7\u30ed\u30d5\u30a1\u30a4\u30ea\u30f3\u30b0<\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ \u30af\u30a8\u30ea\u5b9f\u884c\u6642\u9593\u306e\u8a08\u6e2c\n$startTime = microtime(true);\n\n$result = Order::query()\n    -&gt;select('customer_id')\n    -&gt;distinct()\n    -&gt;whereYear('created_at', '2024')\n    -&gt;get();\n\n$executionTime = microtime(true) - $startTime;\nLog::info(\"Query execution time: {$executionTime} seconds\");<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-22\">SQL\u30af\u30a8\u30ea\u6700\u9069\u5316\u306e\u305f\u3081\u306e\u30c8\u30e9\u30d6\u30eb\u30b7\u30e5\u30fc\u30c6\u30a3\u30f3\u30b0<\/h3>\n\n\n\n<p>\u5b9f\u884c\u8a08\u753b\u306e\u5206\u6790\u3068\u6700\u9069\u5316\u624b\u6cd5\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>EXPLAIN\u306e\u6d3b\u7528<\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ \u30af\u30a8\u30ea\u306e\u5b9f\u884c\u8a08\u753b\u3092\u53d6\u5f97\n$query = User::query()\n    -&gt;select('role')\n    -&gt;distinct()\n    -&gt;where('status', 'active')\n    -&gt;toSql();\n\n$bindings = User::query()\n    -&gt;select('role')\n    -&gt;distinct()\n    -&gt;where('status', 'active')\n    -&gt;getBindings();\n\n$explainResults = DB::select(\"EXPLAIN {$query}\", $bindings);\n\n\/\/ \u5b9f\u884c\u8a08\u753b\u306e\u5206\u6790\nforeach ($explainResults as $result) {\n    if ($result-&gt;rows &gt; 1000) {\n        Log::warning('Large table scan detected', [\n            'table' =&gt; $result-&gt;table,\n            'rows' =&gt; $result-&gt;rows\n        ]);\n    }\n}<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li>\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u4f7f\u7528\u72b6\u6cc1\u306e\u78ba\u8a8d<\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ \u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u4f7f\u7528\u72b6\u6cc1\u306e\u5206\u6790\n$indexAnalysis = DB::select(\"\n    SELECT \n        INDEX_NAME,\n        COLUMN_NAME,\n        SEQ_IN_INDEX\n    FROM \n        information_schema.STATISTICS\n    WHERE \n        TABLE_SCHEMA = ? AND \n        TABLE_NAME = ?\n\", [\n    config('database.connections.mysql.database'),\n    'users'\n]);\n\n\/\/ \u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u306e\u6700\u9069\u5316\u63d0\u6848\nforeach ($indexAnalysis as $index) {\n    Log::info('Index analysis:', [\n        'index' =&gt; $index-&gt;INDEX_NAME,\n        'column' =&gt; $index-&gt;COLUMN_NAME,\n        'sequence' =&gt; $index-&gt;SEQ_IN_INDEX\n    ]);\n}<\/pre>\n\n\n\n<p>\u30c8\u30e9\u30d6\u30eb\u30b7\u30e5\u30fc\u30c6\u30a3\u30f3\u30b0\u306e\u30c1\u30a7\u30c3\u30af\u30ea\u30b9\u30c8\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u554f\u984c\u306e\u7279\u5b9a<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30b9\u30ed\u30fc\u30af\u30a8\u30ea\u30ed\u30b0\u306e\u78ba\u8a8d<\/li>\n\n\n\n<li>\u30e1\u30e2\u30ea\u4f7f\u7528\u91cf\u306e\u76e3\u8996<\/li>\n\n\n\n<li>\u5b9f\u884c\u6642\u9593\u306e\u8a08\u6e2c<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u554f\u984c\u89e3\u6c7a\u306e\u30a2\u30d7\u30ed\u30fc\u30c1<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u306e\u898b\u76f4\u3057<\/li>\n\n\n\n<li>\u30af\u30a8\u30ea\u306e\u6700\u9069\u5316<\/li>\n\n\n\n<li>\u30ad\u30e3\u30c3\u30b7\u30e5\u306e\u5c0e\u5165\u691c\u8a0e<\/li>\n\n\n\n<li>\u30c1\u30e3\u30f3\u30af\u51e6\u7406\u306e\u5b9f\u88c5<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u4e88\u9632\u7684\u5bfe\u7b56<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u5b9a\u671f\u7684\u306a\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u30e2\u30cb\u30bf\u30ea\u30f3\u30b0<\/li>\n\n\n\n<li>\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u30e1\u30f3\u30c6\u30ca\u30f3\u30b9<\/li>\n\n\n\n<li>\u30ad\u30e3\u30c3\u30b7\u30e5\u6226\u7565\u306e\u898b\u76f4\u3057<\/li>\n\n\n\n<li>\u30af\u30a8\u30ea\u30ed\u30b0\u306e\u5206\u6790<\/li>\n<\/ul>\n\n\n\n<p>\u30a8\u30e9\u30fc\u767a\u751f\u6642\u306e\u5bfe\u5fdc\u30d5\u30ed\u30fc\uff1a<\/p>\n\n\n\n<p>\u201c`php<br>try {<br>\/\/ distinct\u3092\u4f7f\u7528\u3057\u305f\u30af\u30a8\u30ea\u306e\u5b9f\u884c<br>$result = DB::transaction(function () {<br>return Order::query()<br>-&gt;select(\u2018customer_id\u2019)<br>-&gt;distinct()<br>-&gt;get();<br>});<br>} catch (QueryException $e) {<br>\/\/ \u30a8\u30e9\u30fc\u30ed\u30b0\u306e\u8a18\u9332<br>Log::error(\u2018Query execution failed\u2019, <a href=\"\">\u2018error\u2019 =&gt; $e-&gt;getMessage(), \u2018sql\u2019 =&gt; $e-&gt;getSql(), \u2018bindings\u2019 =&gt; $e-&gt;getBindings() <\/a>);<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ \u30a8\u30e9\u30fc\u30cf\u30f3\u30c9\u30ea\u30f3\u30b0\nif ($e-&gt;errorInfo[1] == 1205) { \/\/ Lock wait timeout\n    \/\/ \u30c7\u30c3\u30c9\u30ed\u30c3\u30af\u5bfe\u7b56\n    retry(3, function () {\n        \/\/ \u30af\u30a8\u30ea\u306e\u518d\u5b9f\u884c\n    }, 100);\n}<\/pre>\n\n\n\n<p>} catch (\\Exception $e) {<br>\/\/ \u305d\u306e\u4ed6\u306e\u30a8\u30e9\u30fc\u51e6\u7406<br>report($e);<br>throw $e;<br>}<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-23\">\u5b9f\u88c5\u4f8b\u3067\u5b66\u3076distinct\u306e\u6d3b\u7528<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-24\">\u30e6\u30fc\u30b6\u30fc\u4e00\u89a7\u3067\u306e\u91cd\u8907\u9664\u5916\u5b9f\u88c5<\/h3>\n\n\n\n<p>\u5b9f\u969b\u306e\u30e6\u30fc\u30b6\u30fc\u7ba1\u7406\u30b7\u30b9\u30c6\u30e0\u3067\u3088\u304f\u5fc5\u8981\u3068\u306a\u308b\u91cd\u8907\u9664\u5916\u306e\u5b9f\u88c5\u4f8b\u3092\u7d39\u4ecb\u3057\u307e\u3059\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u8907\u6570\u306e\u4f1a\u54e1\u30b9\u30c6\u30fc\u30bf\u30b9\u3092\u6301\u3064\u30e6\u30fc\u30b6\u30fc\u306e\u4e00\u89a7\u8868\u793a<\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ \u30e2\u30c7\u30eb\u5b9a\u7fa9\nclass User extends Model\n{\n    public function memberships()\n    {\n        return $this-&gt;hasMany(Membership::class);\n    }\n}\n\n\/\/ \u30ea\u30dd\u30b8\u30c8\u30ea\u30af\u30e9\u30b9\u306e\u5b9f\u88c5\nclass UserRepository\n{\n    public function getUniqueActiveUsers()\n    {\n        return User::query()\n            -&gt;select('users.*')\n            -&gt;distinct()\n            -&gt;join('memberships', 'users.id', '=', 'memberships.user_id')\n            -&gt;where('memberships.status', 'active')\n            -&gt;with(['memberships' =&gt; function ($query) {\n                $query-&gt;where('status', 'active');\n            }])\n            -&gt;orderBy('users.created_at', 'desc')\n            -&gt;paginate(20);\n    }\n\n    \/\/ \u91cd\u8907\u30a2\u30ab\u30a6\u30f3\u30c8\u306e\u691c\u51fa\u3068\u7d71\u5408\n    public function findDuplicateUsers()\n    {\n        return User::query()\n            -&gt;select('email')\n            -&gt;selectRaw('COUNT(*) as count')\n            -&gt;selectRaw('GROUP_CONCAT(id) as user_ids')\n            -&gt;groupBy('email')\n            -&gt;having('count', '&gt;', 1)\n            -&gt;get()\n            -&gt;map(function ($result) {\n                return [\n                    'email' =&gt; $result-&gt;email,\n                    'count' =&gt; $result-&gt;count,\n                    'ids' =&gt; explode(',', $result-&gt;user_ids)\n                ];\n            });\n    }\n}<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li>\u30a2\u30af\u30bb\u30b9\u6a29\u9650\u7ba1\u7406\u3067\u306e\u6d3b\u7528<\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class PermissionService\n{\n    public function getUsersWithUniquePermissions()\n    {\n        return User::query()\n            -&gt;select('users.*')\n            -&gt;distinct()\n            -&gt;join('role_user', 'users.id', '=', 'role_user.user_id')\n            -&gt;join('role_permission', 'role_user.role_id', '=', 'role_permission.role_id')\n            -&gt;with(['roles.permissions'])\n            -&gt;get()\n            -&gt;map(function ($user) {\n                return [\n                    'id' =&gt; $user-&gt;id,\n                    'name' =&gt; $user-&gt;name,\n                    'unique_permissions' =&gt; $user-&gt;roles\n                        -&gt;flatMap-&gt;permissions\n                        -&gt;unique('id')\n                        -&gt;values()\n                ];\n            });\n    }\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-25\">\u5546\u54c1\u30ab\u30c6\u30b4\u30ea\u3067\u306e\u6d3b\u7528\u4e8b\u4f8b<\/h3>\n\n\n\n<p>EC \u30b5\u30a4\u30c8\u3067\u3088\u304f\u5fc5\u8981\u3068\u306a\u308b\u5546\u54c1\u30ab\u30c6\u30b4\u30ea\u95a2\u9023\u306e\u5b9f\u88c5\u4f8b\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u968e\u5c64\u5316\u3055\u308c\u305f\u30ab\u30c6\u30b4\u30ea\u306e\u4e00\u89a7\u8868\u793a<\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class CategoryRepository\n{\n    public function getUniqueParentCategories()\n    {\n        return Category::query()\n            -&gt;select('categories.*')\n            -&gt;distinct()\n            -&gt;whereNull('parent_id')\n            -&gt;with(['children' =&gt; function ($query) {\n                $query-&gt;select('id', 'parent_id', 'name')\n                    -&gt;orderBy('name');\n            }])\n            -&gt;get();\n    }\n\n    \/\/ \u5546\u54c1\u304c\u767b\u9332\u3055\u308c\u3066\u3044\u308b\u30ab\u30c6\u30b4\u30ea\u306e\u307f\u3092\u53d6\u5f97\n    public function getActiveCategories()\n    {\n        return Category::query()\n            -&gt;select('categories.*')\n            -&gt;distinct()\n            -&gt;join('products', 'categories.id', '=', 'products.category_id')\n            -&gt;where('products.status', 'active')\n            -&gt;withCount(['products' =&gt; function ($query) {\n                $query-&gt;where('status', 'active');\n            }])\n            -&gt;orderBy('products_count', 'desc')\n            -&gt;get();\n    }\n}<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li>\u30ab\u30c6\u30b4\u30ea\u5225\u306e\u5546\u54c1\u5206\u6790<\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class ProductAnalytics\n{\n    public function getCategoryPerformance()\n    {\n        return DB::query()\n            -&gt;select([\n                'categories.name as category',\n                DB::raw('COUNT(DISTINCT products.id) as product_count'),\n                DB::raw('COUNT(DISTINCT orders.id) as order_count'),\n                DB::raw('SUM(order_items.quantity * order_items.price) as total_revenue')\n            ])\n            -&gt;from('categories')\n            -&gt;join('products', 'categories.id', '=', 'products.category_id')\n            -&gt;leftJoin('order_items', 'products.id', '=', 'order_items.product_id')\n            -&gt;leftJoin('orders', 'order_items.order_id', '=', 'orders.id')\n            -&gt;groupBy('categories.id', 'categories.name')\n            -&gt;orderByDesc('total_revenue')\n            -&gt;get();\n    }\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-26\">\u30a2\u30af\u30bb\u30b9\u30ed\u30b0\u96c6\u8a08\u3067\u306e\u5b9f\u8df5\u4f8b<\/h3>\n\n\n\n<p>\u30a2\u30af\u30bb\u30b9\u30ed\u30b0\u306e\u5206\u6790\u3084\u96c6\u8a08\u3067\u6d3b\u7528\u3067\u304d\u308b\u5b9f\u88c5\u4f8b\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u671f\u9593\u5225\u306e\u30e6\u30cb\u30fc\u30af\u30a2\u30af\u30bb\u30b9\u5206\u6790<\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class AccessLogAnalytics\n{\n    public function getUniqueVisitorStats($startDate, $endDate)\n    {\n        return AccessLog::query()\n            -&gt;select([\n                DB::raw('DATE(created_at) as date'),\n                DB::raw('COUNT(DISTINCT ip_address) as unique_visitors'),\n                DB::raw('COUNT(DISTINCT session_id) as unique_sessions'),\n                DB::raw('COUNT(DISTINCT user_id) as unique_users')\n            ])\n            -&gt;whereBetween('created_at', [$startDate, $endDate])\n            -&gt;groupBy(DB::raw('DATE(created_at)'))\n            -&gt;orderBy('date')\n            -&gt;get()\n            -&gt;map(function ($stat) {\n                return [\n                    'date' =&gt; $stat-&gt;date,\n                    'unique_visitors' =&gt; $stat-&gt;unique_visitors,\n                    'unique_sessions' =&gt; $stat-&gt;unique_sessions,\n                    'unique_users' =&gt; $stat-&gt;unique_users,\n                    'conversion_rate' =&gt; $stat-&gt;unique_users \/ $stat-&gt;unique_visitors * 100\n                ];\n            });\n    }\n\n    \/\/ \u30da\u30fc\u30b8\u3054\u3068\u306e\u30e6\u30cb\u30fc\u30af\u30a2\u30af\u30bb\u30b9\u6570\u3092\u53d6\u5f97\n    public function getPageViewStats($period = '30days')\n    {\n        $startDate = now()-&gt;sub($period);\n\n        return AccessLog::query()\n            -&gt;select([\n                'page_url',\n                DB::raw('COUNT(*) as total_views'),\n                DB::raw('COUNT(DISTINCT ip_address) as unique_views'),\n                DB::raw('AVG(TIMESTAMPDIFF(SECOND, created_at, updated_at)) as avg_time_on_page')\n            ])\n            -&gt;where('created_at', '&gt;=', $startDate)\n            -&gt;groupBy('page_url')\n            -&gt;orderByDesc('unique_views')\n            -&gt;get()\n            -&gt;map(function ($stat) {\n                return [\n                    'page_url' =&gt; $stat-&gt;page_url,\n                    'total_views' =&gt; $stat-&gt;total_views,\n                    'unique_views' =&gt; $stat-&gt;unique_views,\n                    'avg_time_on_page' =&gt; round($stat-&gt;avg_time_on_page, 2),\n                    'return_rate' =&gt; ($stat-&gt;total_views - $stat-&gt;unique_views) \/ $stat-&gt;unique_views * 100\n                ];\n            });\n    }\n}<\/pre>\n\n\n\n<p>\u5b9f\u88c5\u306e\u30dd\u30a4\u30f3\u30c8\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u30e2\u30c7\u30eb\u8a2d\u8a08<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u9069\u5207\u306a\u30ea\u30ec\u30fc\u30b7\u30e7\u30f3\u306e\u5b9a\u7fa9<\/li>\n\n\n\n<li>\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u306e\u52b9\u679c\u7684\u306a\u8a2d\u5b9a<\/li>\n\n\n\n<li>\u30b9\u30b3\u30fc\u30d7\u306e\u6d3b\u7528<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u30af\u30a8\u30ea\u306e\u6700\u9069\u5316<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u5fc5\u8981\u306a\u30ab\u30e9\u30e0\u306e\u307f\u306e\u9078\u629e<\/li>\n\n\n\n<li>\u9069\u5207\u306aJOIN\u306e\u4f7f\u7528<\/li>\n\n\n\n<li>\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u3092\u8003\u616e\u3057\u305fWHERE\u53e5<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u5bfe\u7b56<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30c1\u30e3\u30f3\u30af\u51e6\u7406\u306e\u5c0e\u5165<\/li>\n\n\n\n<li>\u30ad\u30e3\u30c3\u30b7\u30e5\u306e\u6d3b\u7528<\/li>\n\n\n\n<li>N+1\u554f\u984c\u306e\u56de\u907f<\/li>\n<\/ul>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u5b9f\u88c5\u4f8b\u306f\u3001\u5b9f\u969b\u306e\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u3067\u3059\u3050\u306b\u6d3b\u7528\u3067\u304d\u308b\u5f62\u3067\u63d0\u4f9b\u3057\u3066\u3044\u307e\u3059\u3002\u8981\u4ef6\u306b\u5fdc\u3058\u3066\u9069\u5207\u306b\u30ab\u30b9\u30bf\u30de\u30a4\u30ba\u3057\u3066\u3054\u5229\u7528\u304f\u3060\u3055\u3044\u3002<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Warning: Undefined array key &#8220;is_admin&#8221; in \/home\/xs392991\/dexall.co.jp\/public_html\/articles\/wp-content\/themes\/ &#8230; <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[12],"tags":[],"class_list":{"0":"post-2553","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-php","7":"nothumb"},"_links":{"self":[{"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/posts\/2553","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=2553"}],"version-history":[{"count":2,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/posts\/2553\/revisions"}],"predecessor-version":[{"id":2555,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/posts\/2553\/revisions\/2555"}],"wp:attachment":[{"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2553"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=2553"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=2553"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}