- SQL резултат по определена стойност на колона
1234
WT форуми -> PHP MySQL ASP.NET -> SQL резултат по определена стойност на колона
Създайте нова тема Напишете отговор 
Автор Съобщение
djidja83
Нов
Нов

Регистриран на: 02/01/2016 11:49 pm

Support: 0
Bonus: 0
Мнения: 45
Мнение 27/06/2018 7:44 pm      Отговорете с цитат


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


Намерих едни излишни ... Very Happy
Не зная дали са само те.
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
Revelation
Потребител
Потребител

Регистриран на: 24/03/2013 3:23 pm

Support: 54
Bonus: 108
Мнения: 698
Мнение 27/06/2018 7:57 pm      Отговорете с цитат


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

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

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

Регистриран на: 02/01/2016 11:49 pm

Support: 0
Bonus: 0
Мнения: 45
Мнение 27/06/2018 8:04 pm      Отговорете с цитат


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

Регистриран на: 24/03/2013 3:23 pm

Support: 54
Bonus: 108
Мнения: 698
Мнение 27/06/2018 8:18 pm      Отговорете с цитат


PHP code:

<?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']);
}


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

Малко промених логиката. Де факто въртя цикъла докато взема нужните рецепти, като взимам random рецепти.
Не съм правил проверка дали вече рецептата е взета, така че може да стане така че има повтарящи, но ако това сработи, лесно ще ти добавя и проверката.

Последната промяна е направена от Revelation на 27/06/2018 8:34 pm; мнението е било променяно общо 1 път
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
raiden
Активен
Активен

Регистриран на: 08/12/2006 10:13 am

Support: 189
Bonus: 464
Мнения: 2181
Мнение 27/06/2018 8:23 pm      Отговорете с цитат


Можеш да вземеш 3 основни и 2 междинни с 1 UNION заявка, но понеже можеш да имаш сортиране и лимит само веднъж в 1 заявка ще трябва да направиш UNION от две заявки - първата взима 3 случайни основни, втората взима 2 случайни междинни
PHP code:

$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();
?>


Последната промяна е направена от raiden на 27/06/2018 8:28 pm; мнението е било променяно общо 1 път
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
Revelation
Потребител
Потребител

Регистриран на: 24/03/2013 3:23 pm

Support: 54
Bonus: 108
Мнения: 698
Мнение 27/06/2018 8:27 pm      Отговорете с цитат


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


Само по този начин не се сетих да направя вложените селекти, да го ... Very Happy Very Happy

П.П. Сигурен ли си, че заявката в това си състояние ще работи?

Последната промяна е направена от Revelation на 27/06/2018 8:31 pm; мнението е било променяно общо 1 път
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
djidja83
Нов
Нов

Регистриран на: 02/01/2016 11:49 pm

Support: 0
Bonus: 0
Мнения: 45
Мнение 27/06/2018 8: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


Имаше и друга грешка, но нея я оправих - не съм съвсем боса Very Happy .
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
raiden
Активен
Активен

Регистриран на: 08/12/2006 10:13 am

Support: 189
Bonus: 464
Мнения: 2181
Мнение 27/06/2018 8:31 pm      Отговорете с цитат


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


Само по този начин не се сетих да направя вложените селекти, да го ... Very Happy Very Happy

Very Happy Very Happy
Страшен loop иначе, само трябва да оправиш вътрешния иф за междинните да е < 1 иначе ако вземе 2 междинни преди 3 основни и попадне на междинно ще го добави Question
Edit: https://www.db-fiddle.com/f/ahkhotu2VKj254qbKnjq79/0
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
djidja83
Нов
Нов

Регистриран на: 02/01/2016 11:49 pm

Support: 0
Bonus: 0
Мнения: 45
Мнение 27/06/2018 8:35 pm      Отговорете с цитат


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


PHP code:
if ( $recipe['eating'] == $inbetween_string && count($inbetween_recipies) < 2 ) {


и

PHP code:
 if ( $recipe['eating'] == $main_string && count($main_recipies) < 2 ) {
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
Revelation
Потребител
Потребител

Регистриран на: 24/03/2013 3:23 pm

Support: 54
Bonus: 108
Мнения: 698
Мнение 27/06/2018 8:42 pm      Отговорете с цитат


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


Само по този начин не се сетих да направя вложените селекти, да го ... Very Happy Very Happy

Very Happy Very Happy
Страшен loop иначе, само трябва да оправиш вътрешния иф за междинните да е < 1 иначе ако вземе 2 междинни преди 3 основни и попадне на междинно ще го добави Question
Edit: https://www.db-fiddle.com/f/ahkhotu2VKj254qbKnjq79/0


Няма да има проблем, защото като станат 2 рецепти, ако е междинна отново просто ще пропусне if-а.
А иначе на долния if проверката трябва да е < 3, а не 2.

@djidja я направи

PHP code:

var_dump($recipe);
exit;


Веднага след

PHP code:

$recipe = array_rand($recipies);


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

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

PHP code:

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


Но не съм сигурен.

Последната промяна е направена от Revelation на 27/06/2018 8:43 pm; мнението е било променяно общо 2 пъти
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
raiden
Активен
Активен

Регистриран на: 08/12/2006 10:13 am

Support: 189
Bonus: 464
Мнения: 2181
Мнение 27/06/2018 8:42 pm      Отговорете с цитат


Ако ползваш кода на колегата, имай предвид че array_rand връща ключ на масива, а не елемент. Ще трябва да замениш $recipe['eating'] със $recipes[$recipe]['eating']
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
djidja83
Нов
Нов

Регистриран на: 02/01/2016 11:49 pm

Support: 0
Bonus: 0
Мнения: 45
Мнение 27/06/2018 8:45 pm      Отговорете с цитат


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


Само по този начин не се сетих да направя вложените селекти, да го ... Very Happy Very Happy

П.П. Сигурен ли си, че заявката в това си състояние ще работи?


Select filed! Smile
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
Покажи мнения от преди:    
Създайте нова тема   Напишете отговор    web-tourist.net Форуми -> PHP MySQL ASP.NET Часовете са според зоната GMT + 2 Часа
1234
Страница 2 от 4


 
Идете на:  
Не Можете да пускате нови теми
Не Можете да отговаряте на темите
Не Можете да променяте съобщенията си
Не Можете да изтривате съобщенията си
Не Можете да гласувате в анкети