BG Development


  Reply to this topicStart new topicStart Poll

> Малко помощ за база данни и SELECT and COUNT
rootkit82
Публикувано на: 28-01-2021, 01:43
Quote Post



Име: Драго
Група: Потребител
Ранг: Новопостъпил

Мнения: 6
Регистриран на: 28.01.21



Здравейте от мен. В момента навлизам в програмирането ... ей така за удоволствие и нищо повече. Та си правя разни експериментални неща. В момента имам следния проблем. Имам две бази с имена galleryCat: gal_id, gallery, uidUsers и другата е: imageCat: img_id, gal_id, file_name, uidUsers. Да кажа за двете бази .... в galleryCat се записват ИД на галерията и името на добавената галерия от потребителя. В imageCat съответно ид на снимката, ид на галерията в която се поства снимката, пътя на снимката и накрая е номера на регистрирания потребител.
Идеята е ..........от двете бази да се вижда само името на галерията, колко снимки има в самата галерия под номер и 1 снимка от дадената галерия.
Стигнах до този код :
CODE
$sql = "SELECT gallery,COUNT(*)
       FROM galleryCat INNER JOIN imageCat
       WHERE galleryCat.gal_id=imageCat.gal_id and galleryCat.uidUsers =  ".$_SESSION['userId']."
       GROUP BY galleryCat.gal_id";


Но след четене и пробване нещата са до кривата круша. По какъв начин да вкарам file_name в кода за да може да се вижда и снимката. Понеже в момента както е кода .... се вижда името на Галерията, колко снимки има в самата галерия (6) ... но снимката не се вижда.
Някой може ли да помогне с кода? Как трябва да е правилно да се вкара file_name за да може да се вижда и снимката. Благодаря предварително.
PMEmail Poster
Top
escapeboy
Публикувано на: 28-01-2021, 09:37
Quote Post



Име: Никола Кацаров
Група: Потребител
Ранг: Редовен член

Мнения: 430
Регистриран на: 04.12.04



Както си го направил може към select-a да добавиш imageCat.file_name
CODE
SELECT gallery,COUNT(*), imageCat.file_name FROM galleryCat INNER JOIN imageCat ON imageCat.gal_id = galleryCat.gal_id
....

тъй като правиш групиране ще вземе една от всички снимки. Проблема е че няма да знаеш коя точно и при strict mode може да хвърли грешка

Друг вариант е да използваш вложен селект

CODE
SELECT gallery, count(*), (SELECT file_name FROM imageCat WHERE imageCat.gal_id = galleryCat.gal_id ORDER BY img_id DESC LIMIT 1) as image_file_name
FROM ....


Още един вариант е да вземеш от imageCat таблицата, да направиш JOIN на galleryCat и да групираш по gal_id.

По-добър вариант за именуване на полетата, че не ми харесват така icon_lol.gif
CODE
galleries:
- id
- name
- user_id

images:
- id
- gallery_id
- file_name
- user_id


--------------------
PMEmail PosterUsers Website
Top
thrawn
Публикувано на: 28-01-2021, 10:11
Quote Post



Име:
Група: Потребител
Ранг: Почетен член

Мнения: 3076
Регистриран на: 17.01.17



"Правилното" решение е да се ползва window функция за броенето вместо агрегатна. След това вече е възможно да се получи желаната информация.
Тук въпросът обаче е, на каква база данни ще се изпълнява.
PMEmail Poster
Top
rootkit82
Публикувано на: 28-01-2021, 11:09
Quote Post



Име: Драго
Група: Потребител
Ранг: Новопостъпил

Мнения: 6
Регистриран на: 28.01.21



Здравейте на всички. Благодаря първо за отговорите. Бързам да тествам и да пиша.
escapeboy ..... първия пример посочен от теб съм го пробвал. Към select-a добавих imageCat.file_name но грешката която ми връща при този вид е тази:
CODE
$sql = "SELECT gallery,COUNT(*), imageCat.file_name
       FROM galleryCat INNER JOIN imageCat on imageCat.gal_id = galleryCat.gal_id
       WHERE galleryCat.gal_id=imageCat.gal_id and galleryCat.uidUsers =  ".$_SESSION['userId']."
       GROUP BY galleryCat.gal_id";


ERROR: Could not able to execute SELECT gallery,COUNT(*), imageCat.file_name FROM galleryCat INNER JOIN imageCat on imageCat.gal_id = galleryCat.gal_id WHERE galleryCat.gal_id=imageCat.gal_id and galleryCat.uidUsers = 47 GROUP BY galleryCat.gal_id. Expression #3 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'site.imageCat.file_name' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

Това с вложения селект не бях го пробвал по начина както ти си го написал. Сега го пробвах .... този вариянт написан работи но пак снимка не се вижда. А само име на Галерията, колко снимки са в галерията под номер и до там .... няма снимка.

CODE
$sql = "SELECT gallery,COUNT(*), (SELECT file_name FROM imageCat WHERE imageCat.gal_id = galleryCat.gal_id ORDER BY img_id DESC LIMIT 1) as image_file_name
       FROM galleryCat INNER JOIN imageCat
       WHERE galleryCat.gal_id=imageCat.gal_id and galleryCat.uidUsers =  ".$_SESSION['userId']."
       GROUP BY galleryCat.gal_id";


Сори за полетата .... но както казах сега влизам в нещата и просто така ми беше по лесно на мен като ги именувам icon_smile.gif. Занапред няма да е така.


thrawn ..... window функция за броенето вместо агрегатна ..... честно казано трябва още да почета за там. Понеже не знам в момента как може да го докарам да работи с window функция
PMEmail Poster
Top
thrawn
Публикувано на: 28-01-2021, 11:11
Quote Post



Име:
Група: Потребител
Ранг: Почетен член

Мнения: 3076
Регистриран на: 17.01.17



С коя версия на mysql си?

CODE
select version()


Това мнение е било редактирано от thrawn на 28-01-2021, 11:11
PMEmail Poster
Top
rootkit82
Публикувано на: 28-01-2021, 11:13
Quote Post



Име: Драго
Група: Потребител
Ранг: Новопостъпил

Мнения: 6
Регистриран на: 28.01.21



А ето това дефакто ми е целия код:

CODE
<?php
   
       include 'includes/dbh.inc.php';

       // Check connection
       if($conn === false){
           die("ERROR: Could not connect. " . mysqli_connect_error());
       }

       // Attempt select query execution
       $sql = "SELECT gallery,COUNT(*), (SELECT file_name FROM imageCat WHERE imageCat.gal_id = galleryCat.gal_id ORDER BY img_id DESC LIMIT 1) as image_file_name
       FROM galleryCat INNER JOIN imageCat
       WHERE galleryCat.gal_id=imageCat.gal_id and galleryCat.uidUsers =  ".$_SESSION['userId']."
       GROUP BY galleryCat.gal_id";
   
       if($result = mysqli_query($conn, $sql)){
           if(mysqli_num_rows($result) > 0){
               
               while($row = mysqli_fetch_array($result)){
                   echo "<div style=\"width: 30%; padding: 2px; margin: 5px 5px 5px 5px; float: left; position: relative; left: 30px;\">";
                      echo " <table>
                                     <tr>
                                       <th><div style=\"font-size: 12px;\"><b>" . $row['gallery'] . "</b></div> </th>

                                     </tr>
                                     <tr>
                                       <td><div>(" . $row['COUNT(*)'] . ") снимки</div></td>

                                     </tr>
                                     <tr>
                                       <td><div><img src='upload_thumb/".$row['file_name']."' width='80' height='80'></div></td>

                                     </tr>
                                     <tr>
                                       <td><div style=\"border-radius: 5px;\"><a style=\"text-decoration: none;\" href=upload.php >Добави снимка </a></div></td>

                                     </tr>
                                   </table>";
                       echo "<br>";
                     
                   echo "</div>";
               }
             
               mysqli_free_result($result);
           } else{
               echo "Резултата показа че имаш (0) галерии <br>";
           }
       } else{
           echo "ERROR: Could not able to execute $sql. " . mysqli_error($conn);
       }

       // Close connection
       mysqli_close($conn);
       ?>


Това мнение е било редактирано от rootkit82 на 28-01-2021, 11:15
PMEmail Poster
Top
rootkit82
Публикувано на: 28-01-2021, 11:18
Quote Post



Име: Драго
Група: Потребител
Ранг: Новопостъпил

Мнения: 6
Регистриран на: 28.01.21



Версията ми е Current PHP version: 7.3.117.3.11
PMEmail Poster
Top
thrawn
Публикувано на: 28-01-2021, 11:20
Quote Post



Име:
Група: Потребител
Ранг: Почетен член

Мнения: 3076
Регистриран на: 17.01.17



За базата данни питам, на за php-то.
Иначе, горе е зададен псевдоним image_file_name на полето а в кодът се опитваш да дотъпваш file_name
PMEmail Poster
Top
rootkit82
Публикувано на: 28-01-2021, 11:25
Quote Post



Име: Драго
Група: Потребител
Ранг: Новопостъпил

Мнения: 6
Регистриран на: 28.01.21



Базата е Server version: 8.0.22 - MySQL Community Server - GPL
Въйййй колко съм зле.
thrawn благодаря много ..... понеже точно това ми е бил проблема. Но просто не го забелязвам ..... а било толкова очевадно.
image_file_name на полето а в кодът се опитвам да дотъпвам file_name .... но просто не съм го забелязал, че е променено.
Няма как да се научиш докато и някой понякога не помогне.
Благодаря много.
Определено бързо се отзовахте да ударите едно рамо.
PMEmail Poster
Top
1 потребители преглеждат тази тема в момента (1 гости, 0 анонимни потребители)
Потребители, преглеждащи темата в момента:

Topic Options Reply to this topicStart new topicStart Poll

 


Copyright © 2003-2019 | BG Development | All Rights Reserved
RSS 2.0