SQL резултат по определена стойност на колона

C++ JAVA
djidja83
Нов
Нов
Posts: 45
Joined: Sat Jan 02, 2016 9:49 pm

Post by djidja83 » Wed Jun 27, 2018 5:44 pm

Revelation wrote:Я си оправи малко къдравите скоби, че нещо не разбирам къде какво отваряш, какво затваряш... :D :D
Намерих едни излишни ... :D
Не зная дали са само те.

User avatar
Revelation
Web-tourist
Web-tourist
Posts: 861
Joined: Sun Mar 24, 2013 1:23 pm
Answers: 62

Post by Revelation » Wed Jun 27, 2018 5:57 pm

Има още излишни и код излишен(направо грешен).

Сега ще ти го надраскам набързо. Няма да го тествам, че не ми се правят тестови данни в момента.

Междувременно, тествай заявката дали ти връща резултатите, които очакваш и пиши.

djidja83
Нов
Нов
Posts: 45
Joined: Sat Jan 02, 2016 9:49 pm

Post by djidja83 » Wed Jun 27, 2018 6:04 pm

Много ти благодаря - махах, слагах, променях - никакъв ефект. Само това ми остана от целия проект. Ще тествам и ще пиша.
Благодаря!

User avatar
Revelation
Web-tourist
Web-tourist
Posts: 861
Joined: Sun Mar 24, 2013 1:23 pm
Answers: 62

Post by Revelation » Wed Jun 27, 2018 6:18 pm

[php]
<?php

// connection

$main_string = "основно";
$inbetween_string = "междинно";
$sql = "SELECT * FROM Recipies WHERE eating REGEXP '$a|$b' ORDER BY RAND()";
$result = mysqli_query($conn, $sql);

// Взимаме всички върнати рецепти
$recipies = mysqli_fetch_assoc($result);

// Декларираме празен масив, където ще слагаме
// рецептите за междинно хранене
$inbetween_recipies = [];

// Декларираме празен масив, където ще слагаме
// рецептите за основно хранене
$main_recipies = [];

// Въртим цикъла докато не съберем 2 рецепти за междинно и 3 рецепти за основно
while( ((count($inbetween_recipies) < 2) && (count($main_recipies) < 3)) ) {

// Взимаме случайна рецепта (ако искаш да е случайна естествено)
$recipe = array_rand($recipies);

// Ако рецептата е за междинно хранене и не сме взели нужния брой
// то добавяме към масива за рецепти за междинно хранене
if ( $recipe['eating'] == $inbetween_string && count($inbetween_recipies) < 2 ) {
$inbetween_recipies[] = $recipe;
}

// Ако рецептата е за основно хранене и не сме взели нужния брой
// то добавяме към масива за рецепти за основно хранене
if ( $recipe['eating'] == $main_string && count($main_recipies) < 3 ) {
$main_recipies[] = $recipe;
}
}

// Когато приключи цикъла е нужно да комбинираме двата масива
$collected_recipies = array_merge($main_recipies, $inbetween_recipies);

// Принтираме линкове към рецептите
foreach( $collected_recipies as $k => $recipe ) {
printf('<a href="rec.php?id=%d"> %s - %s - %s</a><br />', $recipe['id'], $recipe['title'], $recipe['blocks'], $recipe['eating']);
}
[/php]

Не съм тествал кода, може и да има грешки.

Малко промених логиката. Де факто въртя цикъла докато взема нужните рецепти, като взимам random рецепти.
Не съм правил проверка дали вече рецептата е взета, така че може да стане така че има повтарящи, но ако това сработи, лесно ще ти добавя и проверката.
Last edited by Revelation on Wed Jun 27, 2018 6:34 pm, edited 1 time in total.

raiden
Гуру
Гуру
Posts: 2182
Joined: Fri Dec 08, 2006 8:13 am
Answers: 190
Location: Варна

Post by raiden » Wed Jun 27, 2018 6:23 pm

Можеш да вземеш 3 основни и 2 междинни с 1 UNION заявка, но понеже можеш да имаш сортиране и лимит само веднъж в 1 заявка ще трябва да направиш UNION от две заявки - първата взима 3 случайни основни, втората взима 2 случайни междинни
[php]
$sql = "SELECT * FROМ
(SELECT * FROM Recipies
WHERE eating = 'основно'
order by RAND() LIMIT 3) r1
UNION
SELECT * FROM
(SELECT * FROM Recipies
WHERE eating = 'междинно'
order by RAND() LIMIT 2) r2";
$result = mysqli_query($conn, $sql);
if (!$result) {
die("Select failed");
}
while($row = mysqli_fetch_assoc($result)) {
$id = $row['id'];
$title = $row['title'];
$blocks = $row['blocks'];
$eating = $row['eating'];


echo ('<a href="rec.php?id=' . $id . '">' . $title . ' - ' . $blocks . ' - ' . $eating . '<br></a>');
}
$conn->close();
?>[/php]
Last edited by raiden on Wed Jun 27, 2018 6:28 pm, edited 1 time in total.

User avatar
Revelation
Web-tourist
Web-tourist
Posts: 861
Joined: Sun Mar 24, 2013 1:23 pm
Answers: 62

Post by Revelation » Wed Jun 27, 2018 6:27 pm

raiden wrote:Можеш да вземеш 3 основни и 2 междинни с 1 UNION заявка, но понеже можеш да имаш сортиране и лимит само веднъж в 1 заявка ще трябва да направиш UNION от две заявки - първата взима 3 случайни основни, втората взима 2 случайни междинни
Само по този начин не се сетих да направя вложените селекти, да го ... :D :D

П.П. Сигурен ли си, че заявката в това си състояние ще работи?
Last edited by Revelation on Wed Jun 27, 2018 6:31 pm, edited 1 time in total.

djidja83
Нов
Нов
Posts: 45
Joined: Sat Jan 02, 2016 9:49 pm

Post by djidja83 » Wed Jun 27, 2018 6:30 pm

Сега ми излиза това

Warning: Illegal string offset 'eating' in C:\xampp\htdocs\menu1.php on line 61

Warning: Illegal string offset 'eating' in C:\xampp\htdocs\menu1.php on line 67


Имаше и друга грешка, но нея я оправих - не съм съвсем боса :D .

raiden
Гуру
Гуру
Posts: 2182
Joined: Fri Dec 08, 2006 8:13 am
Answers: 190
Location: Варна

Post by raiden » Wed Jun 27, 2018 6:31 pm

Revelation wrote:
raiden wrote:Можеш да вземеш 3 основни и 2 междинни с 1 UNION заявка, но понеже можеш да имаш сортиране и лимит само веднъж в 1 заявка ще трябва да направиш UNION от две заявки - първата взима 3 случайни основни, втората взима 2 случайни междинни
Само по този начин не се сетих да направя вложените селекти, да го ... :D :D
:D :D
Страшен loop иначе, само трябва да оправиш вътрешния иф за междинните да е < 1 иначе ако вземе 2 междинни преди 3 основни и попадне на междинно ще го добави :?:
Edit: https://www.db-fiddle.com/f/ahkhotu2VKj254qbKnjq79/0

djidja83
Нов
Нов
Posts: 45
Joined: Sat Jan 02, 2016 9:49 pm

Post by djidja83 » Wed Jun 27, 2018 6:35 pm

Можеше да напиша и редовете кои са :?


[php]if ( $recipe['eating'] == $inbetween_string && count($inbetween_recipies) < 2 ) {[/php]

и

[php] if ( $recipe['eating'] == $main_string && count($main_recipies) < 2 ) {[/php]

User avatar
Revelation
Web-tourist
Web-tourist
Posts: 861
Joined: Sun Mar 24, 2013 1:23 pm
Answers: 62

Post by Revelation » Wed Jun 27, 2018 6:42 pm

raiden wrote:
Revelation wrote:
raiden wrote:Можеш да вземеш 3 основни и 2 междинни с 1 UNION заявка, но понеже можеш да имаш сортиране и лимит само веднъж в 1 заявка ще трябва да направиш UNION от две заявки - първата взима 3 случайни основни, втората взима 2 случайни междинни
Само по този начин не се сетих да направя вложените селекти, да го ... :D :D
:D :D
Страшен loop иначе, само трябва да оправиш вътрешния иф за междинните да е < 1 иначе ако вземе 2 междинни преди 3 основни и попадне на междинно ще го добави :?:
Edit: https://www.db-fiddle.com/f/ahkhotu2VKj254qbKnjq79/0
Няма да има проблем, защото като станат 2 рецепти, ако е междинна отново просто ще пропусне if-а.
А иначе на долния if проверката трябва да е < 3, а не 2.

@djidja я направи

[php]
var_dump($recipe);
exit;
[/php]

Веднага след

[php]
$recipe = array_rand($recipies);
[/php]

Защото очевидно върнатия резултат не е правилен.

Вероятно ще трябва да е нещо такова:

[php]
if ( $recipe[0]['eating'] ... )
[/php]

Но не съм сигурен.
Last edited by Revelation on Wed Jun 27, 2018 6:43 pm, edited 2 times in total.

Post Reply