Премини към съдържанието
Форумът в приложение

По-лесно сърфиране. Научи повече.

Kaldata.com - Форуми

Приложение на форума на цял екран с push известия, значки и други.

За да инсталирате това приложение на iOS и iPadOS
  1. Докоснете Иконата за споделяне в Safari
  2. Превъртете менюто и докоснете Добавяне към началния екран.
  3. Докоснете Добавяне в горния десен ъгъл.
За да инсталирате това приложение на Android
  1. Докоснете менюто с 3 точки (⋮) в горния десен ъгъл на браузъра.
  2. Докоснете Добавяне към началния екран или Инсталиране на приложение.
  3. Потвърдете, като докоснете Инсталиране.

Добре дошли!

Добре дошли в нашите форуми, пълни с полезна информация. Имате проблем с компютъра или телефона си? Публикувайте нова тема и ще намерите решение на всичките си проблеми. Общувайте свободно и открийте безброй нови приятели.

Моля, регистрирайте се за да публикувате тема и да получите пълен достъп до всички функции.

 

Проблем със заявка PHP

Featured Replies

Здравейте, една заявка искам да я сложа в таблица. Не успях да я вмъкна в основната заявка. Ето и кода:

 <th>
    <?php echo $row[($query = mysqli_query($mysqli,"SELECT SUM(`likes`) FROM `voting` WHERE `song_id`=1"))]; ?>
    </th>

Изписва ми warning:

Warning: Illegal offset type...

Къде греша в кода?

Приложила си доста оригинален начин за взимане на данни от базата, който обаче е неправилен.

Ето тука е показано как става:

http://php.net/manual/en/mysqli-result.fetch-row.php

Редактирано от gothicrock (преглед на промените)

  • Автор

Всъщност заявката ми е:

$table = mysqli_query($mysqli,"SELECT  song_id, song_name, janr_name,  singers.names FROM `songs` INNER JOIN `singers` ON songs.singer_id = singers.singer_id
	INNER JOIN `janr_songs` WHERE janr_songs.janr_id = songs.janr_id "); 
	$row = mysqli_fetch_array($table); 
	{	
		echo "<table border='1' >";  
		echo "<tr><th>№</th><th>Song</th><th>Artist</th><th>Song genre</th><th>Likes</th><th>Dislikes</th><th>LIKED</th><th>DISLIKED</th></tr>";  

	
    while($row = mysqli_fetch_array($table))
    {
?>
    <tr>
    <th>
    <?php echo $row['song_id']; ?>
    </th>
    <th>
    <?php echo $row['song_name']; ?>
    </th>
	<th>
    <?php echo $row['names']; ?>
    </th>
    <th>
    <?php echo $row['janr_name']; ?>
    </th>
    <th>
    <?php echo $row['likes']; ?>
    </th>
    <th>
    <?php echo $row['dislikes']; ?>
    </th>

но трябва да добавя и 2-те колони за общ брой лайк/дислайк от тази таблица `voting` от БД, но не мога да го измисля как да стане към тази заявка.

Виж дали ще стане с тази заявка:

SELECT song_id, song_name, janr_name, singers.names, v.vote
FROM `songs`
INNER JOIN `singers` ON songs.singer_id = singers.singer_id
INNER JOIN `janr_songs` ON janr_songs.janr_id = songs.janr_id
LEFT JOIN (SELECT song_id, SUM(`likes`) AS vote 
			FROM `voting` 
			GROUP BY song_id) AS v
	ON songs.song_id = v.song_id

Взимаш резултата с:

<?php echo $row['vote']; ?>

Ако броиш харесванията, е по-правилно да сложиш COUNT(*) вместо SUM(`likes`).

Редактирано от gothicrock (преглед на промените)

Нещо съм пропуснал, че трябва да се извадят и dislikes - виж дали това работи.

Резултатите се вадят както в твоя код.

SELECT song_id, song_name, janr_name, singers.names, v.likes, v.dislikes
FROM `songs`
INNER JOIN `singers` ON songs.singer_id = singers.singer_id
INNER JOIN `janr_songs` ON janr_songs.janr_id = songs.janr_id
LEFT JOIN (SELECT song_id, SUM(likes) AS likes, SUM(dislikes) AS dislikes 
			FROM `voting` 
			GROUP BY song_id) AS v
	ON songs.song_id = v.song_id

Редактирано от gothicrock (преглед на промените)

  • Автор

Трябва ми и да имам една таблица, която да е като тази, само че да показва само тези песни, които са харесани от определен юзър -например с `user_id` =3, но трябва и да показва общия брой лайкове, не само тези на този юзър. Моят код е:

$table = mysqli_query($mysqli,"SELECT songs.song_id, song_name, janr_name, singers.names, v.likes, v.dislikes FROM `songs`
    INNER JOIN `singers` ON songs.singer_id = singers.singer_id
    INNER JOIN `janr_songs` ON janr_songs.janr_id = songs.janr_id
    INNER JOIN (SELECT song_id,SUM(`likes`) AS likes, SUM(`dislikes`) AS dislikes FROM `voting`
    WHERE `user_id`='3' GROUP BY song_id ) AS v
    ON songs.song_id = v.song_id ");

 

показва ми само тези песни, но броя лайкове е само на този юзър и не знам как да напиша WHERE клаузата да има общия брой лайкове.

 

Да, "gothicrock", аз  добавих dislikes, но сега това не мога да измисля. :)

Редактирано от iveto89 (преглед на промените)

Пробвай това:

SELECT songs.song_id, song_name, janr_name, singers.names, v1.user_likes, v1.user_dislikes, v2.likes, v2.dislikes
FROM `songs`
INNER JOIN `singers` ON songs.singer_id = singers.singer_id
INNER JOIN `janr_songs` ON janr_songs.janr_id = songs.janr_id
INNER JOIN (SELECT song_id, SUM(`likes`) AS user_likes, SUM(`dislikes`) AS user_dislikes
		FROM `voting`
		WHERE `user_id`='3'
		GROUP BY song_id) AS v1 
	ON songs.song_id = v1.song_id
INNER JOIN (SELECT song_id, SUM(`likes`) AS likes, SUM(`dislikes`) AS dislikes
		FROM `voting`
		GROUP BY song_id) AS v2 
	ON v1.song_id = v2.song_id	

съответно трябва да си вземеш user_likes и user_dislikes.

Само трябва да направиш да си взима динамично user_id-то.

Редактирано от gothicrock (преглед на промените)

  • Автор

Работи :) Благодаря!

Много са ми трудни тези заявки станат по-заплетени...

Работи :) Благодаря!

Много са ми трудни тези заявки станат по-заплетени...

 

То със заявките така се случва. :)

 

Виж и този вариант дали върви и дали няма да е по-бърз:

SELECT songs.song_id, song_name, janr_name, singers.names, v1.user_likes, v1.user_dislikes, v2.likes, v2.dislikes
FROM (SELECT song_id, SUM(`likes`) AS user_likes, SUM(`dislikes`) AS user_dislikes
		FROM `voting`
		WHERE `user_id`='3'
		GROUP BY song_id) AS v1
INNER JOIN `songs` ON v1.song_id = songs.song_id 		
INNER JOIN `singers` ON songs.singer_id = singers.singer_id
INNER JOIN `janr_songs` ON janr_songs.janr_id = songs.janr_id
INNER JOIN (SELECT song_id, SUM(`likes`) AS likes, SUM(`dislikes`) AS dislikes
		FROM `voting`
		GROUP BY song_id) AS v2 
	ON v1.song_id = v2.song_id	
  • Автор

Да, но трябва в да ми излизат само лайкнатите песни в една таблица, а в друга дислайкнатите. Аз като го направя за едното, ще го направя и за другото. Но тук трябва нещо да променя, защото ми излизат и лайкнати и дислайкнати от този юзър в една таблица.

Да, но трябва в да ми излизат само лайкнатите песни в една таблица, а в друга дислайкнатите. Аз като го направя за едното, ще го направя и за другото. Но тук трябва нещо да променя, защото ми излизат и лайкнати и дислайкнати от този юзър в една таблица.

 

Просто си махаш ненужните полета от заявката. Ако ще ползваш една заявка за двете, принтваш полетата, които ти трябват. Ето ти ги филтрирани:

(Ако ще ползваш първия вариант на заявката, правиш аналогичните неща.)

За харесани:

SELECT songs.song_id, song_name, janr_name, singers.names, v1.user_likes, v2.likes
FROM (SELECT song_id, SUM(`likes`) AS user_likess
		FROM `voting`
		WHERE `user_id`='3'
		GROUP BY song_id) AS v1
INNER JOIN `songs` ON v1.song_id = songs.song_id 		
INNER JOIN `singers` ON songs.singer_id = singers.singer_id
INNER JOIN `janr_songs` ON janr_songs.janr_id = songs.janr_id
INNER JOIN (SELECT song_id, SUM(`likes`) AS likes
		FROM `voting`
		GROUP BY song_id) AS v2 
	ON v1.song_id = v2.song_id

За нехаресани:

SELECT songs.song_id, song_name, janr_name, singers.names, v1.user_dislikes, v2.dislikes
FROM (SELECT song_id, SUM(`dislikes`) AS user_dislikes
		FROM `voting`
		WHERE `user_id`='3'
		GROUP BY song_id) AS v1
INNER JOIN `songs` ON v1.song_id = songs.song_id 		
INNER JOIN `singers` ON songs.singer_id = singers.singer_id
INNER JOIN `janr_songs` ON janr_songs.janr_id = songs.janr_id
INNER JOIN (SELECT song_id, SUM(`dislikes`) AS dislikes
		FROM `voting`
		GROUP BY song_id) AS v2 
	ON v1.song_id = v2.song_id

Редактирано от gothicrock (преглед на промените)

  • Автор

Трябва да си има колоните Likes, Dislikes, но песните, които се изписват в редовете трябва да са само харесани от потребителя или само нехаресани от потребителя, като си им пише общия брой лайкове/дислайкове :D малко объркващо


 

 

Трябва да си има колоните Likes, Dislikes, но песните, които се изписват в редовете трябва да са само харесани от потребителя или само нехаресани от потребителя, като си им пише общия брой лайкове/дислайкове :D малко объркващо

 

А с тази заявка дава ли ги правилно?

SELECT songs.song_id, song_name, janr_name, singers.names, v1.user_likes, v1.user_dislikes, v2.likes, v2.dislikes
FROM `songs`
INNER JOIN `singers` ON songs.singer_id = singers.singer_id
INNER JOIN `janr_songs` ON janr_songs.janr_id = songs.janr_id
INNER JOIN (SELECT song_id, SUM(`likes`) AS user_likes, SUM(`dislikes`) AS user_dislikes
		FROM `voting`
		WHERE `user_id`='3'
		GROUP BY song_id) AS v1 
	ON songs.song_id = v1.song_id
INNER JOIN (SELECT song_id, SUM(`likes`) AS likes, SUM(`dislikes`) AS dislikes
		FROM `voting`
		GROUP BY song_id) AS v2 
	ON v1.song_id = v2.song_id
  • Автор

Дава ги по същия начин. Аз пробвах да махна "SUM(`likes`) AS user_likes", за да останат например само дислайкнатите песни, но не се промени.

SELECT songs.song_id, song_name, janr_name, singers.names,  v1.user_dislikes, v2.likes, v2.dislikes
    FROM `songs`
    INNER JOIN `singers` ON songs.singer_id = singers.singer_id
    INNER JOIN `janr_songs` ON janr_songs.janr_id = songs.janr_id
    INNER JOIN (SELECT song_id, SUM(`dislikes`) AS user_dislikes
            FROM `voting`
            WHERE `user_id`='3'
            GROUP BY song_id) AS v1
        ON songs.song_id = v1.song_id
    INNER JOIN (SELECT song_id, SUM(`likes`) AS likes, SUM(`dislikes`) AS dislikes
            FROM `voting`
            GROUP BY song_id) AS v2
        ON v1.song_id = v2.song_id  

 

Редактирано от iveto89 (преглед на промените)

 

Дава ги по същия начин. Аз пробвах да махна "SUM(`likes`) AS user_likes", за да останат например само дислайкнатите песни, но не се промени.

SELECT songs.song_id, song_name, janr_name, singers.names,  v1.user_dislikes, v2.likes, v2.dislikes
    FROM `songs`
    INNER JOIN `singers` ON songs.singer_id = singers.singer_id
    INNER JOIN `janr_songs` ON janr_songs.janr_id = songs.janr_id
    INNER JOIN (SELECT song_id, SUM(`dislikes`) AS user_dislikes
            FROM `voting`
            WHERE `user_id`='3'
            GROUP BY song_id) AS v1
        ON songs.song_id = v1.song_id
    INNER JOIN (SELECT song_id, SUM(`likes`) AS likes, SUM(`dislikes`) AS dislikes
            FROM `voting`
            GROUP BY song_id) AS v2
        ON v1.song_id = v2.song_id  

 

 

 

Така. Значи заявката трябва да връща песните на даден юзър, които той е харесал или не е харесал, заедно с общия брой харесвания и нехаресвания на дадената песен. Заявката предполага да има колона like и колона dislike - така предполагам, че трябва да изглежда таблицата от написаното в темата. Ако нещата не стоят така, трябва да видя таблиците в базата - ако случаят е такъв, пиши направо на лични, да не пускаш схемата на базата тук.

Редактирано от gothicrock (преглед на промените)

  • Автор

Да, но "Значи заявката трябва да връща песните на даден юзър, които той е харесал или не е харесал" - това с харесването е в едната таблица, нехаресаните - в друга. писах ти на ЛС за БД.

Архивирана тема

Темата е твърде стара и е архивирана. Не можете да добавяте нови отговори в нея, но винаги можете да публикувате нова тема, в която да продължи дискусията. Регистрирайте се или влезте във вашия профил за да публикувате нова тема.

Разглеждащи това в момента 0

  • Няма регистрирани потребители разглеждащи тази страница.

Дарение

  • Подкрепи съществуването на форума - направи дарение
    32%
    Дарени 315 € от нужните 1 000 €

Бюлетин

Получавайте известие, когато има важна промяна или новина свързана с форума.

Профил

Навигация

Търсене

Търсене

Конфигуриране на push известия в браузъра

Chrome (Android)
  1. Докоснете иконата на катинар до адресната лента.
  2. Докоснете Разрешения → Известия.
  3. Променете предпочитанията си.
Chrome (Desktop)
  1. Кликнете върху иконата на катинар в адресната лента.
  2. Изберете Настройки на сайта.
  3. Намерете Известия и коригирайте предпочитанията си.